处理程序removeCallbacksAndMessages后仍然在后台线程中发布runnable

时间:2015-01-28 16:36:54

标签: android multithreading android-handler

我在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,那将是乏味的。 有没有什么好方法可以解决这类问题呢?

提前谢谢。

0 个答案:

没有答案