【发布时间】:2015-05-16 01:47:53
【问题描述】:
谁能告诉我我是否理解正确?我所拥有的似乎有效,但它似乎比许多加载器示例更复杂......我想知道我是否有过于复杂的事情。我有一个使用多个 AsyncTaskLoader 的活动。因此,我为 LoaderCallbacks 实现内部类,而不是让活动实现 LoaderCallback 接口。我读到匿名内部类可以泄漏活动,所以我不得不将它创建为一个对活动的弱引用的静态类。 onLoadFinished 需要执行一个片段事务,所以我需要一个处理程序。再次是内部类活动泄漏问题,因此 Handler 是一个静态类。此外,我读到可以在 Activity 暂停时调用 handleMessage,因此我需要在 Handler 中实现 pause 和 resume 方法。这真的都是必要的吗?
//here are the relavent bits from my activity
private static class SessionListener implements LoaderManager.LoaderCallbacks<SessionStatus> {
private final WeakReference<MainActivity> mTarget;
private SessionListener(MainActivity target) {
this.mTarget = new WeakReference<>(target);
}
@Override
public Loader<SessionStatus> onCreateLoader(int id, Bundle args) {
return new SessionCheckLoader(mTarget.get(), args);
}
@Override
public void onLoadFinished(Loader<SessionStatus> arg0, SessionStatus arg1) {
MainActivity target = mTarget.get();
if (arg1 == MainActivity.SessionStatus.CLOSED && target != null) {
target.mHandler.sendEmptyMessage(MSG_SHOW_CLOSED_DIALOG);
}
}
@Override
public void onLoaderReset(Loader<SessionStatus> arg0) {
}
};
//the handler with pause/resume
private static class HandlerClass extends Handler {
private final WeakReference<MainActivity> mTarget;
public HandlerClass(MainActivity context) {
mTarget = new WeakReference<>(context);
}
Stack<Message> s = new Stack<>();
boolean is_paused = false;
public synchronized void pause() {
is_paused = true;
}
public synchronized void resume() {
is_paused = false;
while (! s.empty())
{
sendMessageAtFrontOfQueue(s.pop());
}
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (is_paused) {
s.push(Message.obtain(msg));
return;
}
MainActivity target = mTarget.get();
if (target != null) {
if (msg.what == MSG_SHOW_CLOSED_DIALOG) {
target.sessionDialog();
}else if (msg.what == MSG_POP_STACK) {
target.getSupportFragmentManager().popBackStack(null, 0);
}
}
}
}
private LoaderManager.LoaderCallbacks<SessionStatus> sessionCheckListener = new SessionListener(this);
private HandlerClass mHandler = new HandlerClass(this);
@Override
protected void onPause() {
super.onPause();
mHandler.pause();
}
@Override
protected void onPostResume() {
super.onPostResume();
mHandler.resume();
}
【问题讨论】:
标签: android android-fragments loader android-handler