在 activity 完成后停止 Handler Runnable

Stopping a Handler Runnable after activity finishes

我有一个方法可以让 TextView 充当 "loading..." 指示器。

我正在使用每 .5 秒更新一次 TextView 的 Runnable 来执行此操作。这是我的功能:

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();
}

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

如何使用 AsyncTask?它是一个与 activity 绑定的 class,可以让您覆盖 4 个方法,一个执行后台作业,另外 3 个直接与 activity 通信。据我所知,它会在 Activity 被关闭后自动停止工作,但是,如果我对此非常错误,您可以随时调用 AsyncTask.cancel() 方法在 [=13] 中停止它=]() 方法。这不是传统的解决方案,因为 AsyncTask 通常用于短任务,但可以工作。如果您认为 class 可以破解,请参阅 Android 开发人员文档。

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);