Java 在android活动中的静态处理程序上调用post

Java 在android活动中的静态处理程序上调用post,java,android,memory-leaks,static,inner-classes,Java,Android,Memory Leaks,Static,Inner Classes,在下面的文章中,我在Activity类中修改了我的处理程序,如下所示: private static class ActivityHandler extends Handler { private final WeakReference<MyActivity> mActivity; public ActivityHandler(MyActivity activity) { mActivity = new WeakReference< M

在下面的文章中,我在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();
    }
}
然而,在我的活动逻辑的几个方面,我必须调用这个处理程序的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())
行。我做错了什么


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

您正在创建
Runnable
,它是
活动中的一个匿名类,匿名类隐式引用绑定的
活动

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不会超过活动的生命周期(即,如果活动被销毁,它将被销毁),则无需将其更改为静态字段

同一条:

  /**
   * 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() { /* ... */ }
  };
避免在活动中使用非静态内部类,如果 内部类可能超过活动的生命周期

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

  /**
   * 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() { /* ... */ }
  };
您也可以只保留一个 (非静态)对它的引用和调用 onDestroy()中的mHandler.removeCallbacks(mRunnable)


非常感谢。因此,在sRunnable的run方法中,我如何调用setSomeProperties(),它是非静态的?类似于
处理程序
,您可以创建自己的
Runnable
类继承自
Runnable
,并将
活动
实例放在
WeakReference
中。现在,您可以使用
活动
实例调用
setSomeProperties()
。或者,本文评论部分建议的另一种解决方案是在
活动的
onDestroy()
中调用
mHandler.removeCallbacks(mRunnable)
,而不是使
可运行。你也可以这样做。再次感谢你,这非常有帮助。