有人可以告訴我,如果我理解正確嗎?我所看到的似乎有效,但似乎比許多Loader示例涉及的要多得多......我想知道我是否有過複雜的事情。我有一個使用多個AsyncTaskLoader的活動。因此,我實現了LoaderCallbacks的內部類,而不是讓活動實現LoaderCallback接口。我讀過匿名內部類可以泄漏活動,所以我必須將它創建爲靜態類,並且對活動提供了一個弱引用。 onLoadFinished需要執行片段事務,所以我需要一個Handler。內部類活動再次泄漏問題,所以Handler是一個靜態類。此外,我讀了handleMessage可以在Activity暫停時調用,所以我需要在Handler中實現暫停和恢復方法。這真的是必要的嗎?Android LoaderCallbacks.onLoadFinished with Fragment transaction:這是正確的嗎?
//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();
}
我已經找到了一個以您說的Loader具有不同返回類型的方式完成的示例。我發現體育教練說實施不同的課程。不過,我仍然希望看到這樣的例子。 – Andrew 2015-03-13 14:46:51
嘗試使'Activity'實現'LoaderCallbacks
我會試一試。那麼Handler部分是否正確?確實需要暫停/恢復嗎?我想我很困惑,因爲我理解它的處理程序是需要的,因爲你不能從onLoadFinished方法提交片段事務,但它看起來像一個處理程序也可以在提交片段事務的時候被調用? – Andrew 2015-03-16 12:11:47