我在Android中遇到了一个带有处理程序和后台线程的异常NPE异常。
我知道当destroy或者片段在destroy上时,ui小部件将被破坏,所以你必须取消所有待处理的消息或从后台发送的runnable。
例如,在片段回调onDestroyView
中,我调用处理程序' s removeCallbacksAndMessages(null)
删除所有回调。但是,在某些情况下,回调仍然被执行,但当时ui已被破坏,NPE抛出。
以下是样本:
public class SampleFragment extends Fragment {
private Handler mHandler = new Handler() {
@Override public void handleMessage(Message msg) {
switch (msg.what) {
// do your job
}
}
};
@Nullable @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// create some ui
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
new Thread(new Runnable() {
@Override public void run() {
// after a long running work
mHandler.post(new Runnable() {
@Override public void run() {
// OOPS, the ui widget may null!
}
});
}
}).start();
}
@Override public void onDestroyView() {
mHandler.removeCallbacksAndMessages(null);
super.onDestroyView();
}
}
我注意到,在某些时候,在onDestroyView
中,处理程序已经删除了将附加到ui线程的所有pendding消息或runnable,并且视图设置为null为gc。但是线程可能仍处于运行状态,并且处理程序将发布runnable,但视图为null。
简单的方法是从片段'中检查null。在runnable中有getView()
,但是如果所有这些情况都需要检查null,那将是乏味的。
有没有什么好方法可以解决这类问题呢?