私の静的ハンドラはWeakReference
からActivity
になりました。これはよく文書化されたメモリリークの問題を防ぐためです。Androidハンドラの変更WeakReference
私は長い遅延メッセージを投稿し、このメッセージを自分のアクティビティ(フォアグラウンドにあるはずです)に配信します。
オリエンテーションを変更すると、自分のアクティビティが破棄され、ハンドラは破棄されたはずの古いアクティビティへの参照を持っています。
これを回避するには、私のonCreate
でこれを行います。
if(mHandler == null)
mHandler = new LoginHandler(this);
else {
mHandler.setTarget(this);
}
そして、私のハンドラは、静的なグローバル変数として宣言されています。私が知りたいことならば
private static class LoginHandler extends Handler {
private WeakReference<LoginActivity> mTarget;
LoginHandler(LoginActivity target) {
mTarget = new WeakReference<LoginActivity>(target);
}
public void setTarget(LoginActivity target) {
mTarget = new WeakReference<LoginActivity>(target);
}
@Override
public void handleMessage(Message msg) {
// process incoming messages here
LoginActivity activity = mTarget.get();
switch (msg.what) {
case Constants.SUCCESS:
activity.doSomething();
break;
default:
activity.setStatusMessage("failed " + msg.obj, STATUS_TYPE_DONE);
}
}
}
があります:
private static LoginHandler mHandler = null;
と実装クラスは以下のようにも静的ですWeakReferenceをonCreate
に変更すると何かが間違っているのですか、それともこの方法に間違いがありますか?
おかげで、
は、この上の任意の意見を@CommonsWare:リンク以下
は、より多くの詳細を持っていますか? – Ali