web-dev-qa-db-ja.com

AndroidリスナーでWeakReferenceを使用する理由

私は大規模なコードベースに取り組んでおり、多くの場所でこのタイプのコードを確認しています。

public static class RequestCustomData implements View.OnClickListener {
    WeakReference<MainActivity> mainActivity;

    public RequestCustomData(MainActivity activity) {
        mainActivity = new WeakReference<>(activity);
    }

    @Override
    public void onClick(View view) {
        MainActivity activity = mainActivity.get();
        activity.requestCustomData(true, null);
    }
}

なぜこれが使われるのか、私は少し混乱しています。私はこのドキュメントを調べましたが、このタイプのコードが私が取り組んでいるアプリで非常に頻繁に使用されている理由がよくわかりませんでした

https://community.Oracle.com/blogs/enicholas/2006/05/04/understanding-weak-references

これが一般的なパターンである場合、誰でも私に説明できますか?もしそうなら、なぜですか?

13
gmmo

弱い参照とは、簡単に言えば、オブジェクトを強制的にメモリに残すほど強力ではない参照です。

このコードの作成者は、RequestCustomDataオブジェクトがアクティビティ自体よりも長生きする可能性がある場合に、アクティビティコンテキストのリークを回避したいと考えていた可能性があります。

私はお勧めします このトピックに関するRomain Guyの投稿 そして避けるべきいくつかの特定のケース:

24
szym