我收到了一位同事的评论,他说,如果我这样做:
...onClick() {
final Context context = MyActivity.this;
....postDelayed(new Runnable() { ...
Toast.makeText(context, R.string.hello, Toast.LENGTH_SHORT).show();
...
如果帖子在活动被销毁后发生,那么我的活动就会泄露。
我该如何避免这种情况?
答案 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需要是静态的