0

クリーンな状態から最初にアプリに入った後のハンドラーの内部では、ハンドラーはMSG_PULLEDアクションを処理しますが、mainへの参照はnullです。弱参照はnullではありません。どうしてこれが起こっているのでしょうか?

この投稿に触発されました:このHandlerクラスは静的である必要があります。そうでない場合、リークが発生する可能性があります:IncomingHandler

static class MainHandler extends Handler {
    private final WeakReference<MainActivity> wMain; 
    static int angle=0;
    public MainHandler(MainActivity main) {
        super();
        this.wMain = new WeakReference<MainActivity>(main);
    }

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        MainActivity main = wMain.get();
        int what = msg.what;
        if(what == MSG_PULLED) {
            main.startAnim();
        } 
    }
}

そして、私がハンドラーを開始する方法:

static MainHandler mainHandler;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mainHandler = new MainHandler(this);
        mainHandler.sendEmptyMessageDelayed(MSG_PULLED,500);
    }
4

1 に答える 1

1

アプリ内のActivityインスタンスは定期的に破棄され、たとえばディスプレイを回転させたときに新しいインスタンスが作成されます。

その場合に発生するはずのことは、古いインスタンスがガベージコレクションされ、新しいインスタンスのみが存在することです。古いものを周りに置いておくと、漏れが発生します。

メッセージがなくなるまで(?)ゴミ収集できないので、作成された魔女Handlerよりも長生きできます。これは、通常、それらを強く参照しているため、通常Activity、古いものをリークすることになります(収集できるようになるActivityまで) 。HandlerHandlerActivity

コード内の方法は、ガベージコレクションを妨げないWeakReferenceへの弱いリンクを保持することによってその問題を取り除きます。Activity

問題は、get()メソッドを間違った方法で使用することですget()。元のオブジェクトが存在する場合にのみ返されます。それがなくなったとき、あなたは得るnull。ここで:Activity意志はまだアクティブなものである間に存在します(システムによって決定されます)。

これnullも大きな問題ではありませんnullActivityインスタンスが生きていない場合(新しいインスタンスが作成された場合、完全になくなった場合)、インスタンスで有用なことは何もできなくなります。参照がある場合でも、アニメーションは表示されません。

基本的には以下のようにして問題を解決します

@Override
public void handleMessage(Message msg) {
    super.handleMessage(msg);
    MainActivity main = wMain.get();

    // message arrived after activity death
    if (main == null) return;

    int what = msg.what;
    if(what == MSG_PULLED) {
        main.startAnim();
    } 
}

それWeakReference自体(wMain)は、それ自体がメンバー変数として強く参照されるため、nullではありません。nullその中のコンテンツだけが、ある時点で可能/なります。

于 2012-09-29T20:27:39.117 に答える