我有一个使用多个CursorLoaders的片段。一切正常。现在我需要将AsyncTaskLoader添加到同一个片段中。
问题是,我如何使用相同的LoaderManager.LoaderCallbacks接口来管理我的CursorLoader和AsyncTaskLoader?
我的想法是,由于CursorLoader是一个AsyncTaskLoader,那么我应该能够将LoaderCallBacks调整为两者,但我可能会错过这条船......
答案 0 :(得分:2)
这仅在所有加载器返回相同类型时才有效。如果这是真的,那么您只需为您启动的每个加载器指定唯一ID。将相同的ID传递给onCreateLoader()调用,这样您只需检查该ID即可确定要创建的加载程序。
答案 1 :(得分:0)
我觉得这个问题太迟了,希望能帮助一些人。
我刚刚在同一个Activity中完成了一个带有多个加载器的项目,一个用于数据库的CursorLoader,另一个用于网络作业的AsynctaskLoader。
class YourActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks {
// you still implements LoaderManager.LoaderCallbacks but without add <returnType>
//and you have to cast the data into your needed data type in onLoadFinished()
Private int loader1 = 1; // eg. CursorLoaderId
private int loader2 =2; //eg. AsynctaskLoaderId
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);
// init loader with different Id
getSupportLoaderManager().initLoader(yourLoaderId, null, this);
}
@Override
public Loader onCreateLoader(int id, Bundle args) {
if (id == loader1 ) {
//YourLoaderClass1 is you loaderClass where you implement onStartLoading and loadingInBackground()
return new YourLoaderClass1();
} else if (id == loader2 ) {
return new YourLoaderClass2();
}
return null;
}
@Override
public void onLoadFinished(Loader loader, Object data) {
int id = loader.getId();// find which loader you called
if (id == loader1 ) {
yourMethod1((List< >) data); // eg. cast data to List<String>
} else if (id == loader2 ) {
yourMethod1((String) data); // eg. cast data to String
}
}
@Override
public void onLoaderReset(Loader loader) {
int id = loader.getId();
if (id == loader1 ) {
} else if (id == loader2 ) {
}
}
}