postDelayed中的Toast是否泄漏了活动?

时间:2016-05-25 07:50:06

标签: android memory-leaks

我收到了一位同事的评论,他说,如果我这样做:

    ...onClick() {
    final Context context = MyActivity.this;
    ....postDelayed(new Runnable() { ...
          Toast.makeText(context, R.string.hello, Toast.LENGTH_SHORT).show();
    ...

如果帖子在活动被销毁后发生,那么我的活动就会泄露。

我该如何避免这种情况?

1 个答案:

答案 0 :(得分:1)

通过在Runnable中创建匿名Activity类,您将创建对外部类的隐式引用,从而泄露活动的上下文。 您的延迟Toast消息将在主线程消息队列中继续,以防止对您的活动上下文进行垃圾收集。

使用带有对活动上下文的弱引用的静态处理程序(静态内部类不包含对其外部类的隐式引用)。

private final ToastHandler mHandler = new ToastHandler(this);

private static class ToastHandler extends Handler {
    private final WeakReference<MainActivity> mActivity;

    public ToastHandler(MainActivity activity) {
        mActivity = new WeakReference<>(activity);
    }

    @Override
    public void handleMessage(Message msg) {
        MainActivity activity = mActivity.get();
        Bundle data = msg.getData();
        if (activity != null) {
            Toast.makeText(activity, data.getString("TEST_KEY"), Toast.LENGTH_LONG).show();
        }
    }
}


  private static final Runnable runnable = new Runnable() {
      @Override
      public void run() { 
                    Message message = new Message();
                    Bundle bundle = new Bundle();
                    bundle.putString("TEST_KEY", "TEST");
                    message.setData(bundle);
                    mHandler.handleMessage(message);
      }
  };

在你的onClick ...

 mHandler.postDelayed(runnable, 1000);

编辑:哎呀,你的runnable需要是静态的