我有一个显示天气数据的片段,它运行一个后台线程,基本上只是在我的主 UI 中调用一个函数来检查我的预测是否仍然有效。此函数更新 UI,因此我使用 aHandler
并将 a 发布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();
}
}
这很好用;问题是当我改变我的屏幕方向时。当前活动被破坏,如果线程正在运行,它会尝试将 a 发布Runnable
到不再存在的 UI 线程。因此,我running
在类中放置了一个成员变量,并在我的活动调用时UpdateThread
设置 if 。但是,即使我已将 变量设置为 false,我的线程仍会尝试发布 a ,但现在为 null!它不应该走那么远,但它是!false
onPause
UpdateThread.running
Runnable
Handler
我做错了吗?我的日志消息“要求线程停止”被打印出来,所以我知道它已经将运行设置为 false。
任何人都可以提供见解吗?
谢谢