我有一个片段显示运行后台线程的天气数据,该后台线程基本上只调用主UI中的函数来检查我的预测是否仍然有效。此函数更新UI,因此我使用Handler
并将Runnable
发布到主线程,如下所示:
public class WaveFxListFragment extends Fragment implements
LoaderManager.LoaderCallbacks<Cursor>, View.OnClickListener {
// .....
// handler for dealing with synchronising update thread with UI
private Handler mHandler;
private UpdateThread mUpdateThread;
private class UpdateThread extends Thread {
volatile boolean running = false;
@Override
public void run() {
running = true;
while (running) {
// get main UI thread to perform update check:
Log.d(TAG, "Handler is " + mHandler);
mHandler.post(new Runnable() { // getting null pointer error here!
@Override
public void run() {
checkValidTime();
}
});
try {
Thread.sleep(1000); // sleep 1 second
} catch (InterruptedException e) {
Log.d(TAG, "Thread was interrupted!");
e.printStackTrace();
}
}
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Reuse existing handler:
mHandler = getActivity().getWindow().getDecorView().getHandler();
}
@Override
public void onResume() {
super.onResume();
// start update checker:
mUpdateThread = new UpdateThread();
mUpdateThread.start();
}
@Override
public void onPause() {
// stop update thread
Log.d(TAG, "Asking thread to stop");
mUpdateThread.running = false;
super.onPause();
}
}
这很好用;问题是当我改变屏幕方向时。当前活动被破坏,如果线程正在运行,它会尝试将Runnable
发布到不再存在的UI线程。因此,我在running
类中添加了UpdateThread
成员变量,并在我的活动调用false
时设置为onPause
。但是,即使我将UpdateThread.running
变量设置为false,我的线程仍会尝试发布Runnable
,但Handler
现在为空!它不应该那么远,但它是!
我这样做错了吗?我的日志消息“要求线程停止”被打印出来,所以我知道它正在将运行设置为假。
有人能提供见解吗?
由于
答案 0 :(得分:0)
您可以采取一些措施来解决此问题。
将运行设置为false后中断线程。这应该导致线程提前退出,或者至少使错误更早出现。
检查您的处理程序在更新线程中是否为空,并在onPause中将其设置为null。
将mHandler的赋值移动到onResume,以确保在调用更新线程时mHandler有效。