在安卓活动中的静态处理程序上调用帖子



在本文之后,我在 Activity 类中修改了我的处理程序,如下所示:

private static class ActivityHandler extends Handler
{
private final WeakReference<MyActivity> mActivity;
public ActivityHandler(MyActivity activity)
{
mActivity = new WeakReference< MyActivity >(activity);
}
public final MyActivity getActivity()
{
return mActivity.get();
}
}

处理程序已初始化:

ActivityHandler handler = new ActivityHandler(this);

但是,在我的活动逻辑的几个点上,我必须在这个处理程序上调用 post。所以取而代之的是:

handler.post(new Runnable()
{
@Override
public void run()
{
setSomeProperties();
}
});

我现在这样做:

handler.post(new Runnable()
{
@Override
public void run()
{
MyActivity activity = handler.getActivity();
if (activity != null)
{
activity.setSomeProperties();
}
}
});

当我运行应用程序并检查hprof文件是否存在泄漏的活动时,无论这种变化如何,我仍然会被指向handler.post(new Runnable())行。我做错了什么?

附言我已经看到许多示例覆盖处理程序上的handleMessage,但是,我无法与我的案例建立联系并使用它。

您正在创建Runnable,它是Activity中的匿名类,匿名类包含对绑定Activity的隐式引用。

亚历克斯·洛克伍德(Alex Lockwood(在同一篇文章中也谈到了这一点:

修复我们实例化匿名时发生的内存泄漏 可运行类,我们使变量成为类的静态字段 (因为匿名类的静态实例不具有隐式 参考他们的外部类(

要解决此问题(来自同一篇文章(:

/**
* Instances of anonymous classes do not hold an implicit
* reference to their outer class when they are "static".
*/
private static final Runnable sRunnable = new Runnable() {
@Override
public void run() { /* ... */ }
};

但是,我想说的是,如果 Runnable 不会超过活动的生命周期(即如果活动被销毁,就会被销毁(,则无需将其更改为静态字段。

来自同一篇文章:

避免在活动中使用非静态内部类,如果实例 内部类的寿命可能超过活动的生命周期。

本文评论部分的另一个解决方案:

与其使 Runnable 静态,您还可以按住 (非静态(引用它并调用 mHandler.removeCallbacks(mRunnable( in onDestroy((。

最新更新