我正在寻找停止/杀死线程的方法,我看到不推荐使用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 :(得分:1)
你有一个while循环并检查isPaused
然后在循环结束时捕获常规Exception
。即使抛出InterruptedException
,它也会被捕获,然后再次重新运行while循环。
当您捕获isPaused
异常时,您需要将InterruptedException
更改为true,以便while循环停止运行。
答案 1 :(得分: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();
答案 2 :(得分:0)
如果您使用thread.interrupt()
;你应该偶尔检查一下你的Thread
是否被中断了:
if(Thread.currentThread().isInterrupted()) {
return;
}
请注意,检查此标志会重置它;所以,如果你检查过这个标志,你应该:
终止你的主题
Thread.currentThread().interrupt();