Android中的停止处理程序不起作用

时间:2013-12-26 11:25:18

标签: android handler runnable

我有这个处理程序:

private Runnable mRunnableReset = new Runnable() {
     public void run() {
        Log.i("MyApp", "mRunnableReset");
     }
};
private Handler mHandler = new Handler();
private Runnable mRunnable = new Runnable() {
    public void run() {
        while (true) {
            try {
                Thread.sleep(2000);
                mHandler.post(mRunnableReset);
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
    }
};

我尝试在我的onDestroy()方法中使用此代码

mHandler.removeCallbacks(mRunnableReset);
mHandler.removeCallbacksAndMessages(null);

但是mRunnable仍在运行(我可以看到LogCat中的日志)。 如果我使用mRunnable.destroy()我的应用程序崩溃。

我怎么能阻止这个? 谢谢。

2 个答案:

答案 0 :(得分:1)

你正在使用

while(true){
 Thread.sleep(2000);
 mHandler.post(mRunnableReset);
}

它将如何停止呢?它不会。

相反它应该是,

private Runnable mRunnableReset = new Runnable() {
     public void run() {
        Log.i("MyApp", "mRunnableReset");
        mHandler.removeCallbacks(mRunnableReset);
        mHandler.post(mRunnableReset);
     }
};
private Handler mHandler = new Handler();
private Runnable mRunnable = new Runnable() {
    public void run() {
         try {
                Thread.sleep(2000);
                mHandler.post(mRunnableReset);
            } catch (Exception e) {
                // TODO: handle exception
            }
    }
};

然后停止mRunnableReset使用mHandler.removeCallbacks(mRunnableReset);

最好使用mHandler.postDelayed(mRunnableReset, 2000)代替Thread.sleep(2000);

同时检查我的回答here,以便完整掌握Handler的工作方式。

答案 1 :(得分:1)

在发布Runnable(而不是常规Thread.sleep())时,不要使用postDelayed()使用post()