2012-03-20 11 views
7

我有一個使用兩個Loaders的活動。他們每個人都返回不同類型的數據。要從一個Loader中獲取數據,只需將LoaderCallbacks<D>執行到一個Activity中。我想我可以實現LoaderCallbacks<Object>並檢查對象的類型,然後決定它的兩個LoaderCallbacks中的哪一個,但對我來說這似乎是一個破解(主要是因爲這裏缺少類型安全性)。LoaderCallbacks作爲一個靜態內部類(用於處理具有不同數據類型的多個Loaders)

所以我想關於做LoaderCallbacks對象的靜態內部類,像這樣:

private static class geocoderLoaderCallbacks implements LoaderCallbacks<List<Address>>{ 

    @Override 
    public Loader<List<Address>> onCreateLoader(int arg0, Bundle arg1) { 
     GeocoderTask loader = new GeocoderTask(context, ""); 
     return loader; 
    } 

    @Override 
    public void onLoadFinished(Loader<List<Address>> loader, List<Address> data) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onLoaderReset(Loader<List<Address>> loader) { 
     // TODO Auto-generated method stub 

    } 


} 

,然後使用lm.initLoader(0, null, geocoderLoaderCallbacks)

出現兩個問題:可以做,還是應該堅持將LoaderCallbacks實現爲Activity?我如何安全地將上下文傳遞給onCreateLoader?我應該只是在geocoderLoaderCallbacks中構造一個構造函數,然後像這樣傳遞上下文lm.initLoader(0, null, geocoderLoaderCallbacks(this))

這裏有一個類似的問題LoaderManager with multiple loaders: how to get the right cursorloader,但它沒有解釋如何管理兩個不同數據類型的加載器。

回答

9

將代碼從潛在巨人類中移出總是可以的,而且用不同的類來處理代碼,然後用一個可以處理所有事情的代碼來處理代碼會更加簡潔。如果你覺得你的Activity有太多的代碼,你甚至可能想讓它們成爲真正的外部類而不是內部類。 LoaderCallbacks是一個接口,所以你可以並且主要應該在它自己的類中實現它。

在構造函數中傳遞Context沒問題,只要不保存靜態或緩存的引用即可。

+1

我不確定我是否「保持靜態或以其他方式緩存對它的引用」。上下文是需要的,因爲AsyncTaskLoader需要一個。所以我必須將它傳遞給geocoderLoaderCallbacks。但是,我是否應該在我的活動中實例化它並傳遞對此特定活動的引用?它不會泄露活動嗎?在所有示例實現中(Activity實現LoaderCallbacks),它們使用'lm.initLoader(0,null,this);'('this')將引用傳遞給activity。然後它由AsyncTaskLoader自動處理。但它與靜態內部類一樣工作嗎? – 2012-03-20 13:52:22

+1

由於加載器回調類的生命週期與活動本身的生命週期息息相關,因此在不同類中傳遞'Context'對於泄漏是安全的。一旦活動被垃圾收集,所有從那裏傳出的參考也將被收集。唯一不能做的就是使用對你的Activity有一些引用的靜態變量。如果您按照預期使用提供的類,通常不會出現泄漏問題。 – zapl 2012-03-20 14:06:02

+0

太好了,謝謝!和+1提到不要使用靜態變量參考活動 – 2012-03-20 14:14:34

相關問題