我有一個使用兩個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,但它沒有解釋如何管理兩個不同數據類型的加載器。
我不確定我是否「保持靜態或以其他方式緩存對它的引用」。上下文是需要的,因爲AsyncTaskLoader需要一個。所以我必須將它傳遞給geocoderLoaderCallbacks。但是,我是否應該在我的活動中實例化它並傳遞對此特定活動的引用?它不會泄露活動嗎?在所有示例實現中(Activity實現LoaderCallbacks),它們使用'lm.initLoader(0,null,this);'('this')將引用傳遞給activity。然後它由AsyncTaskLoader自動處理。但它與靜態內部類一樣工作嗎? – 2012-03-20 13:52:22
由於加載器回調類的生命週期與活動本身的生命週期息息相關,因此在不同類中傳遞'Context'對於泄漏是安全的。一旦活動被垃圾收集,所有從那裏傳出的參考也將被收集。唯一不能做的就是使用對你的Activity有一些引用的靜態變量。如果您按照預期使用提供的類,通常不會出現泄漏問題。 – zapl 2012-03-20 14:06:02
太好了,謝謝!和+1提到不要使用靜態變量參考活動 – 2012-03-20 14:14:34