Mój statyczny nośnik ma WeakReference
do mojego Activity
(ma to zapobiec dobrze udokumentowanemu problemowi wycieku pamięci).Android Handler zmiana WeakReference
Wysyłam długi, opóźniony komunikat i chcę, aby ta wiadomość została dostarczona do mojej aktywności (która powinna znajdować się na pierwszym planie).
Moją obawą jest to, że podczas zmiany orientacji moja działalność ulega zniszczeniu, a przewodnik ma odniesienie do starej działalności, która powinna zostać zniszczona.
Aby to zrobić w moim onCreate
dla tego działania, robię to.
if(mHandler == null)
mHandler = new LoginHandler(this);
else {
mHandler.setTarget(this);
}
A moja obsługi jest zadeklarowana jako statyczna zmienna globalna:
private static LoginHandler mHandler = null;
i klasy wykonawczego jest statyczna jak poniżej:
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);
}
}
}
Co chcę wiedzieć jest, jeśli jest coś złego w zmianie WeakReference na onCreate
lub jest coś jeszcze nie tak z tym podejściem?
Dzięki,
@CommonsWare jakąkolwiek opinię na ten temat? – Ali