0

我有列表片段AsyncTaskLoader從Internet獲取數據。 列表分段填充,BaseAdapterLoaderManager開始加載時通知片段

當數據加載時,BaseAdapter用旋轉進度條填充第一行。當數據加載並且沒有錯誤發生時,數據被填入ListView。但是如果出現了一些錯誤(我在AsyncTaskLoader中有一個標誌表示錯誤),然後BaseAdapter用錯誤信息填充第一行。

問題:

當裝載有錯誤,LoaderManager自動嘗試重新加載數據(forceLoad()稱爲),這是很好的。但我需要的是通知BaseAdapter數據正在加載,因此BaseAdapter可以將錯誤消息更改爲旋轉進度條。

有當LoaderManager呼籲forceLoad()通知片段的任何簡單的好辦法?

我的建議:

ListFragment將實現以下接口,並通過該ListFragment在AsyncTaskLoader的構造。

public interface LoadingListener { 
    public void onLoadingStatusChanged(boolean isLoading); 
} 

然後,我可以在deliverResult(T data)調用loadInBackground()onLoadingStatusChanged(true)onLoadingStatusChanged(false)。我擔心在AsyncTaskLoader中引用Fragment可能會泄漏該片段。

回答

0

您的建議實施是處理事情的好方法。雖然Loader已經提供了OnLoadCompleteOnLoadCanceled的回調,因此只需要添加一個已啓動的回叫。您也可以實現自定義的OnLoadStart回調,隨時觸發onForceLoad()onStartLoad()被調用,而不是loadInBackground,它將更接近地反映現有的框架回調。

我建議,就像框架回調一樣,你建立了註冊和註銷監聽器的方法,而不是在構造函數中傳遞它,所以你的Fragment可以作爲正常生命週期的一部分來附加/不泄漏。正如你所提到的,將它傳遞給構造函數中沒有辦法刪除它會被認爲是泄漏。

+0

謝謝你的回覆。所以你建議像創建方法寄存器(Fragment f){mFragment = f; }並在Loader中取消註冊(){mFragment = null}並在onAttach()/ onDetach()中調用這些方法以避免泄漏? – traninho

+0

是的,類似的東西,雖然我可能會使它更通用,並通過一個「片段」可以實現的接口。基本上與'Loader'已經有的'OnLoadCompleteListener'和'OnLoadCanceledListener'完全相同的API ... – Devunwired