2014-10-10 135 views
0

我正在寻找一种方法来停止/杀死一个线程,我看到Thread.stop()已被弃用。所以我开始寻找另一种解决方案,看到多个职位表明这一点:寻找一种方法来停止/杀死一个线程

thread.interrupt(); 
thread = null; 

但是,就不会停止我的主题,我的主题是这样的:

public static Thread loadingSpinnerTimer (final Context context, final ImageView imageView){ 
    final Handler mHandler = new Handler(); 
    thread = new Thread(new Runnable() { 
     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      while (!isPaused) { 
       try { 
        Thread.sleep(100); 
        mHandler.post(new Runnable() { 
         @Override 
         public void run() { 
          // TODO Auto-generated method stub 
          // Write your code here to update the UI. 
          Log.e("ThreadMessage","HasRun"); 
          if (ticker == 12){ 
           ticker = 0; 
          } 
          Bitmap myBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.spinner_160x160); 
          Bitmap img = Bitmap.createBitmap(myBitmap.getWidth(), myBitmap.getHeight(), Bitmap.Config.ARGB_8888); //ARGB_8888 transparrent? 
          Canvas canvas = new Canvas(img); 
          int offset = myBitmap.getWidth()*ticker; 
          Rect srcrectangle = new Rect(0, offset, myBitmap.getWidth(), myBitmap.getWidth()+offset); 
          Rect dstrectangle = new Rect(0, 0, myBitmap.getWidth(), myBitmap.getWidth()); 
          canvas.drawBitmap(myBitmap,srcrectangle,dstrectangle,null); 
          img.setHeight(myBitmap.getWidth()); 
          imageView.setImageDrawable(new BitmapDrawable(context.getResources(), img)); 
          ticker++; 
         } 
        }); 
       } catch (Exception e) { 
        // TODO: handle exception 
       } 
      } 
     } 
    }); 
    thread.start(); 
    return thread; 
} 

任何人都得到一个解决方案,我可以用来停止/杀死我的线程?任何帮助深表感谢。

+0

检查[复位标志oracle docs](http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html) – TheLostMind 2014-10-10 15:08:43

+0

看到这个[link](http://stackoverflow.com/a/20528033/4101719) – coderhyme 2014-10-10 15:22:00

回答

1

您有一个while循环并检查isPaused,然后在循环结束处捕获常规Exception。即使InterruptedException被引发,它也会被捕获,然后再次运行while循环。

当您捕获InterruptedException异常以便while循环停止运行时,您需要将isPaused更改为true。

+0

是的,谢谢!我是怎么忽略的:) – user2408952 2014-10-10 18:41:52

0

由于您定期执行任务,所以最好的解决方案是使用ScheduledExecutorService

然后计划任务可以优雅停止呼吁cancel()ScheduledFuture<?>

final Runnable handlerRunnable = new Runnable() { 
    @Override 
    public void run() { 
     // do same work as before 
    } 
}; 
ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor(); 
final Handler mHandler = new Handler(); 
ScheduledFuture<?> sf = ses.scheduleWithFixedDelay(new Runnable() { 
    @Override 
    public void run() { 
     mHandler.post(handlerRunnable); 
    } 
}, 0, 100, TimeUnit.MILLISECONDS); // execute every 100ms 

// stop 
sf.cancel(); 
0

如果使用thread.interrupt();你应该偶尔会检查你的Thread使用像所中断:

if(Thread.currentThread().isInterrupted()) { 
    return; 
} 

注意检查这个标志就复位;所以,如果你曾经检查该标志您应该:

终止您的线程

  1. 列表项
  2. 抛出一个InterruptedException
  3. 通过调用Thread.currentThread().interrupt();