Java 在android活动中的静态处理程序上调用post
在下面的文章中,我在Activity类中修改了我的处理程序,如下所示: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
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)
,而不是使可运行。你也可以这样做。再次感谢你,这非常有帮助。