9

鉴于此代码:

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;
        }
    }
}
4

3 回答 3

10

尝试使用 a WeakReference,如本文所述

于 2012-08-06T16:38:12.083 回答
1

由于您现在使用的是WeakReference,mTarget.get()可能会返回null. 在您编辑的代码中,您没有targetnull执行target.setStatus(R.string.title_not_connected). 因此,NullPointerException如果弱引用对象已被 GC 处理,这可能会抛出一个错误。

于 2012-10-04T12:01:42.577 回答
0

在我的活动的 onDestroy 方法中,我调用:

this.myHandler.removeCallbacksAndMessages(null);

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

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

于 2013-02-12T01:45:40.493 回答