15

我有一個片段,想點擊一個按鈕時啓動裝載器:調用initLoader()後Loader無法啓動?

public class MyFragment extends Fragment { 

    public void onActivityCreated() { 
     super.onActivityCreated(); 

     Button btn = ...; 
     btn.setOnClickListener(new OnClickListener() { 
      public void onClick(View view) { 
       getLoaderManager().initLoader(500, null, mMyCallback); 
      } 
     }); 
    } 

    private LoaderManager.LoaderCallbacks<String> mMyCallback = new LoaderManager.LoaderCallbacks<String>() { 

     @Override 
     public Loader<String> onCreateLoader(int arg0, Bundle arg1) { 
      Log.e(TAG, "LoaderCallback.onCreateLoader()."); 
      return new MyLoader(getActivity()); 
     } 
    } 
} 

public class MyLoader extends AsyncTaskLoader<String> { 
    public MyLoader(Context context) { 
     super(context); 
    } 

    @Override 
    public String loadInBackground() { 
     Log.e(TAG, "Hi, running."); 
     return "terrific."; 
    } 
} 

點擊按鈕後,我可以看到我叫回調的onCreateLoader方法,但從來沒有真正開始創建的裝載機。我們是否需要在loader上調用forceLoad()來實際啓動它?樣品的帖子沒有做到這一點,

感謝

回答

6

以我的經驗,除非我用forceLoad()從來沒有工作過。

您可能會發現這個問題的答案前面的問題有所幫助: Loaders in Android Honeycomb

2

你需要一個參考保持你的方法onCreateLoader創建裝載機的實例。然後,請刷新它,請撥打yourLoader.onContentChanged();

+0

OMG,你從字面上解決了我的整個問題。 – Alex 2013-03-22 23:03:59

32

您需要實施onStartLoading()並在該方法的某處調用forceLoad()

看到這個職位的詳細資料:Implementing Loaders (part 3)

+0

這實際上工作。謝謝! – Roboblob 2014-04-05 08:59:08

+0

我應該在forceLoad()方法中實際執行什麼? – 2014-12-02 06:46:06

+0

@Manikanta我的回答說你應該_call_'forceLoad()',而不是實現它。 – 2014-12-02 06:52:13

2

如果在相同的活動超過1臺裝載機,確保他們的ID不同。我失去了幾個小時就看着辦吧:)關於裝載機

3

三個要點是:

  1. 始終使用forceLoad()方法,同時初始化裝載機。例如:

    getLoaderManager().initLoader(500, null, mMyCallback).forceLoad(); 
    
  2. 始終實施onStartLoading()。當關聯的片段/活動正在啓動時,該功能將自動由LoaderManager調用。

  3. 確保加載器的ID是唯一的,否則新的加載器將不會被調用。

如果仍有問題,您可以通過調用isStarted()方法來檢查裝載機的狀態。