寻找停止/杀死线程的方法

时间:2014-10-10 15:07:12

标签: java android multithreading

我正在寻找停止/杀死线程的方法,我看到不推荐使用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;
}

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

3 个答案:

答案 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;
}

请注意,检查此标志会重置它;所以,如果你检查过这个标志,你应该:

终止你的主题

  1. 列表项
  2. 抛出InterruptedException
  3. 通过调用Thread.currentThread().interrupt();
  4. 重置旗帜