2

说我写:

Runnable runnable = new Runnable(){
    @Override
    public void run() {
        Log.e(TAG, "runnable entered");
        // working
        Log.e(TAG, "runnable completed");
    }
};

Thread t = new Thread(runnable);
t.start();

之后t.start();我们会得到 log 消息runnable 输入。在工作线程时,我总是希望我的可运行对象完成并且完成后我的应用程序将不再在该线程上工作。即我应该总是完成这个可运行的日志;

现在假设我使用 Handler 而不是 Thread 类。

Handler handler = new Handler();
handler.post(runnable);

我可以确定handler.removeCallbacks(runnable)就像 runnable 已经完成并且我的应用程序将不再在这个 runnable 上运行吗?

4

1 回答 1

3

handler.removeCallbacks(runnable)Runnables从消息队列中删除待处理。但不会停止当前正在运行的 Runnable。例如,假设您有一个 Runnable A

class A implements Runnable {

    public void run() {
        handler.removeCallbacks(a);
        Log.i("tag", "are start");
                    // Do work
        Log.i("tag", "end");
    }
}

A a = new A();

你打电话给

handler.post(a);

因此,当第一个可运行的执行时,它将调用该removeCallbacks方法。但是在 logcat 中你会看到输出是

开始

结尾

而如果你不在方法中使用removeCallbacksrun那么输出将是

开始

结尾

开始

结尾

于 2013-03-17T05:09:04.287 回答