Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android don'中的停止处理程序;行不通_Android_Handler_Runnable - Fatal编程技术网

Android don'中的停止处理程序;行不通

Android don'中的停止处理程序;行不通,android,handler,runnable,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() {

我有一个处理程序:

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()方法中使用此代码

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

我怎样才能阻止这一切? 谢谢。

你在用什么

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
            }
    }
};
然后停止
mrunablereset
使用
mHandler.removeCallbacks(mrunablereset)

最好使用
mHandler.postdayed(mrunablereset,2000)
而不是
Thread.sleep(2000)


另外,请检查我的答案,以全面了解处理程序的工作方式。

在发布Runnable(而不是常规的
post()
)时,使用
postDelayed()

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