活动结束后停止Handler Runnable

时间:2015-08-05 23:09:37

标签: java android multithreading runnable

我有一个方法,我将TextView作为“loading ...”指示器。

我使用Runnable执行此操作,每隔0.5秒更新一次TextView。这是我的功能:

public void displayFlash() {
    animate = true;
    Handler handler = new Handler();
    Runnable runnable = new Runnable() {
        public void run() {
            while(animate) {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                handler.post(new Runnable() {
                    public void run() {
                        System.out.println("Running");
                        numFrames++;
                        switch (numFrames % 3) {
                        case 0:
                            loading.setText("Loading.");
                            break;
                        case 1:
                            loading.setText("Loading..");
                            break;
                        case 2:
                            loading.setText("Loading...");
                            break;

                        }
                    }
                });
            }
    }
    };
    new Thread(runnable).start();
}

问题是,在此活动完成(并销毁)之后,线程继续运行。我在Runnable中有一个System.out.println("running");,并且在此活动完成后会继续记录。我需要做些什么来杀死它?我试过handler.removeCallbacks(runnable);Thread.interrupt();没有运气。

2 个答案:

答案 0 :(得分:4)

public void displayFlash() {
    animate = true;
    final Handler handler = new Handler();
    Runnable yourRunnable = new Runnable() {
        @Override
        public void run() {
            System.out.println("Running");
            numFrames++;
            switch (numFrames % 3) {
                case 0:
                    loading.setText("Loading.");
                    break;
                case 1:
                    loading.setText("Loading..");
                    break;
                case 2:
                    loading.setText("Loading...");
                    break;
            }
            handler.postDelayed(this, 500);
        }
    }
    handler.post(yourRunnable);
}

完成后,请致电handler.removeCallbacks(yourRunnable);

答案 1 :(得分:0)

如何使用AsyncTask abbout?它是一个与活动绑定的类,它允许您覆盖4个方法,一个执行后台作业,另一个直接与活动通信。据我所知,它在Activity被解除后自动停止工作,但是,如果我对此非常不对,你总是可以调用AsyncTask.cancel()方法在Activity.onPause()方法中停止它。它不是传统的解决方案,因为AsyncTask通常用于短任务,但可以工作。如果您认为该类可以执行该操作,请参阅Android开发人员以获取文档。