在同一活动中的多个装载机

我有两个从AsyncTaskLoaderinheritance的定制构build的加载器,我想在我的活动中使用它。 他们每个返回不同types的结果。 要使用我的活动进行callback,我必须实现两个接口:

 implements LoaderCallbacks<GetSyncListDataResult>, LoaderCallbacks<ErrorResult> 

但是,试图在同一个类中实现所需的方法,最终会出现重复的方法错误和擦除(???)错误:

 // Methods for the first loader public Loader<GetSyncListDataResult> onCreateLoader(int ID, Bundle bundle) ... public void onLoaderReset(Loader<GetSyncListDataResult> loader) ... public void onLoadFinished(Loader<GetSyncListDataResult> loader, GetSyncListDataResult result) ... // Methods for the second loader public Loader<ErrorResult> onCreateLoader(int ID, Bundle bundle) ... public void onLoaderReset(Loader<ErrorResult> loader) ... public void onLoadFinished(Loader<ErrorResult> loader, ErrorResult result) ... 

显然,这些方法是冲突的,我需要一个简单的方法来解决这个问题。 解决这个问题的正确方法是什么?

Solutions Collecting From Web of "在同一活动中的多个装载机"

正确的答案是根据@dymmeh的注释,也就是说Activity不是为了实现两个LoaderCallbacks接口,而是为了包含两个LoaderCallbacks实现。 举个例子:在你的活动中初始化LoaderCallbacks

 private LoaderCallbacks<GetSyncListDataResult> dataResultLoaderListener = new LoaderCallbacks<GetSyncListDataResult>() { ...methods here... }; private LoaderCallbacks<ErrorResult> errorResultLoaderListener = new LoaderCallbacks<ErrorResult>() { ...methods here... }; 

…并声明你的加载器ID …

 private static final int DATA_RESULT_LOADER_ID = 1; private static final int ERROR_RESULT_LOADER_ID = 2; 

…然后初始化你的装载机…

 getLoaderManager().initLoader(DATA_RESULT_LOADER_ID, dataResultBundle, dataResultLoaderListener); getLoaderManager().initLoader(ERROR_RESULT_LOADER_ID, errorResultBundle, errorResultLoaderListener); 

完成!

 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; private int loader2 =2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail); getSupportLoaderManager().initLoader(REVIEW_LOADER, null, this); getSupportLoaderManager().initLoader(REVIEW_LOADER, 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 ) { } } } 

我的Github例子

这不是必须的。 实现LoaderManager.LoaderCallbacks。 然后,每次初始化一个加载器时,给它一个唯一的ID。 在callback中,您可以检测导致callback的加载器的ID,并采取适当的措施。

那是

 class MyLoader extends Activity implements LoaderManager.LoaderCallbacks<GetSyncDataResult> { ... private static final int LOADER1 = 1; private static final int LOADER2 = 2; ... getLoaderManager().initLoader(LOADER1, null, this); ... getLoaderManager().initLoader(LOADER2, null, this); ... public Loader<GetSyncDataResult> onCreateLoader(int loaderId, Bundle args) { switch (loaderId) { case LOADER1: ... case LOADER2: ... } ... 

等等。