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())
一行。我究竟做错了什么?
p.s.我已经看到很多例子在处理程序上重写handleMessage,但是,我还没有能够与我的案例建立连接并使用它。
非常感谢您的支持。因此,在sRunnable的run方法中,我将如何调用setSomeProperties(),它是非静态的? –
与'Handler'类似,您可以创建自己的'Runnable'类继承'Runnable',并在'WeakReference'中包含'Activity'实例。现在你可以用'Activity'实例调用'setSomeProperties()'。或者在本文的注释部分中提出的另一种解决方案是在Activity的'onDestroy()'中调用'mHandler.removeCallbacks(mRunnable)',而不是使'Runnable'静态。你也可以这样做。 – Bob
再次感谢,这是最有帮助的。 –