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;
}
ご覧のように :
- Handlerクラスのサブクラスである静的内部クラスを作成しています:Android開発者が、Viewサブクラス内の直接内部クラスを回避するためのコマンドをガイドしているため
- Handler静的内部クラスはカスタムChessViewのinvalidate()メソッドを呼び出します。そのため、Android開発者ガイドがViewインスタンスでのハード参照を回避するように推奨しているため、WeakReference内に「ラップ」することにしました。
だからここに私の質問:
- この方法でメモリリークを回避できますか?
- WeakReferenceは最適なタイプですか、それとも代わりにSoftReferenceを使用する必要がありますか?
- そして最後に、カスタムビューは、ビューが表示されている(または関連するアクティビティがアクティブである)限りヒープに残りますか、それとも以前にGCによって収集され、relatedChessView.get()を呼び出すときにnull参照を許可しますか?
事前に感謝し、私の質問が間違って定式化されている場合はお詫び申し上げます。