2015-03-13 58 views
0

有人可以告訴我,如果我理解正確嗎?我所看到的似乎有效,但似乎比許多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(); 
} 

回答

0

您仍然可以在Activity中執行回調。當致電initLoader()爲每個Loader提供一個唯一的ID。在每個回調中的switch聲明中使用Loader.getId()來確定它是哪一個Loader

+0

我已經找到了一個以您說的Loader具有不同返回類型的方式完成的示例。我發現體育教練說實施不同的課程。不過,我仍然希望看到這樣的例子。 – Andrew 2015-03-13 14:46:51

+0

嘗試使'Activity'實現'LoaderCallbacks ',然後將其轉換爲'switch-case'中相應的加載器類型。 – Monstieur 2015-03-13 15:12:12

+0

我會試一試。那麼Handler部分是否正確?確實需要暫停/恢復嗎?我想我很困惑,因爲我理解它的處理程序是需要的,因爲你不能從onLoadFinished方法提交片段事務,但它看起來像一個處理程序也可以在提交片段事務的時候被調用? – Andrew 2015-03-16 12:11:47