2

Viewクラスから直接継承してカスタムビューを作成していますが、WeakReferenceクラスをうまく利用しているかどうか疑問に思っています。まず、これは私のクラスの最も関連性の高い部分です:

public class ChessView extends View {

    public ChessView(Context context, AttributeSet attrs, int defStyle) {
        /* some code removed */
        invalidateHandler = new InvalidateHandler(this);

        new Thread(new Runnable() {

            @Override
            public void run() {
                     invalidateHandler.sendMessage(invalidateHandler.obtainMessage());
        }

        }).start();
    }

    /* some code removed */

    private static class InvalidateHandler extends Handler {

        public InvalidateHandler(ChessView view){
            relatedChessView = new WeakReference<ChessView>(view);
        }

        @Override
        public void handleMessage(Message msg) {
            relatedChessView.get().invalidate();
        }

        private WeakReference<ChessView> relatedChessView; 
    };

    private InvalidateHandler invalidateHandler;

}

ご覧のように :

  1. Handlerクラスのサブクラスである静的内部クラスを作成しています:Android開発者が、Viewサブクラス内の直接内部クラスを回避するためのコマンドをガイドしているため
  2. Handler静的内部クラスはカスタムChessViewのinvalidate()メソッドを呼び出します。そのため、Android開発者ガイドがViewインスタンスでのハード参照を回避するように推奨しているため、WeakReference内に「ラップ」することにしました。

だからここに私の質問:

  1. この方法でメモリリークを回避できますか?
  2. WeakReferenceは最適なタイプですか、それとも代わりにSoftReferenceを使用する必要がありますか?
  3. そして最後に、カスタムビューは、ビューが表示されている(または関連するアクティビティがアクティブである)限りヒープに残りますか、それとも以前にGCによって収集され、relatedChessView.get()を呼び出すときにnull参照を許可しますか?

事前に感謝し、私の質問が間違って定式化されている場合はお詫び申し上げます。

4

1 に答える 1

4

この方法でメモリリークを回避できますか?

はい、しかしこれは必要ありません。

WeakReference は最適なタイプですか、代わりに SoftReference を使用する必要がありますか?

WeakReferenceあなたの場合に行く方法です。SoftReferenceそれらをWeakReference指すハードリファレンスがある限り、両方とも利用可能です。ただし、強い参照がない場合は、WeakReference収集される可能性が高くなりSoftReferenceますが、メモリをクリーンアップする必要がない限り、オブジェクトは保持されます (たとえばSoftReference、より長く残ります)。

そして最後に、ビューが表示されている (または関連するアクティビティがアクティブである) 限り、カスタム ビューはヒープに残りますか、それとも以前に GC によって収集され、 relatedChessView.get() を呼び出すときに null 参照を使用できるようになりますか?

はい、そうなります。上記のように、含まれている の参照を保持してWeakReferenceいる間は収集されません。ObjectsObject

更新: @DeeV の回答に基づいて、弱い参照と弱い参照に関する情報がより正確になるように修正しました。

于 2012-08-10T11:43:20.957 に答える