Android:从静态Handler类调用非静态方法

鉴于此代码:

public class MainActivity extends FragmentActivity implements ActionBar.TabListener { public static final int MESSAGE_NOT_CONNECTED = 1; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_layout); } // ------------------------------------------------- public final void setStatus(int Rid) { final ActionBar actionBar = getActionBar(); actionBar.setSubtitle(Rid); } // ------------------------------------------------- static Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case MESSAGE_NOT_CONNECTED: setStatus(R.string.title_not_connected); break; } } } } 

我得到的编译错误:不能静态引用非静态方法setStatus(int)…

这是有道理的,因为setStatus()中的getActionBar()是一个非静态的方法。

由于警告,我使Handler类成为静态的:这个Handler类应该是静态的,否则可能会发生泄漏。

问题:如何正确地从静态处理程序中访问setStatus()方法?

编辑:新的处理程序代码是答案。

 static class hHandler extends Handler { private final WeakReference<MainActivity> mTarget; hHandler(MainActivity target) { mTarget = new WeakReference<MainActivity>(target); } @Override public void handleMessage(Message msg) { MainActivity target = mTarget.get(); If(target == null) { return; } switch (msg.what) { case MESSAGE_NOT_CONNECTED: target.setStatus(R.string.title_not_connected); break; } } } 

Solutions Collecting From Web of "Android:从静态Handler类调用非静态方法"

尝试使用WeakReference ,如本文所述

由于您现在正在使用WeakReference ,因此mTarget.get()可能会返回null 。 在您编辑的代码中,在执行target.setStatus(R.string.title_not_connected)之前,您没有检查target是否为null 。 所以这可能会抛出一个NullPointerException如果弱引用对象已经被GC化了。

在我的activity的onDestroy方法中,我打电话给:

 this.myHandler.removeCallbacksAndMessages(null); 

这并没有摆脱“这个处理程序类应该是静态或可能发生泄漏”的警告,但我相信它破坏了信息,从而停止泄漏。 我的处理程序类是我的活动的内部非静态类。 我的活动有一个MyHandler myHandler的实例。

当我这样做时,处理程序的handleMessage方法不被调用,我假设这意味着包含处理程序,其中包含对活动的引用已被销毁。 我打开了评论,因为我没有使用任何泄漏testing工具进行testing。 这是我复制这个想法的地方: http ://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html回答者:Cyril 2013年1月15日上午7:50