我有两个自定义构建的加载器AsyncTaskLoader,我想在我的活动中使用它.他们每个都返回不同类型的结果.要将我的活动用于回调,我必须实现两个接口:
implements LoaderCallbacks<GetSyncListDataResult>, LoaderCallbacks<ErrorResult>
Run Code Online (Sandbox Code Playgroud)
但是,尝试在同一个类中实现所需的方法我最终会遇到重复的方法错误和擦除(???)错误:
// 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) ...
Run Code Online (Sandbox Code Playgroud)
显然,方法是冲突的,我需要一个简单的方法来解决这个问题.解决这个问题的正确方法是什么?
Adi*_*ain 51
正确的答案是@dymmeh的注释,即不是为了Activity实现两个LoaderCallbacks接口,而是为了包含两个LoaderCallbacks实现的活动.举例来说:LoaderCallbacks在您的活动中初始化您的字段......
private LoaderCallbacks<GetSyncListDataResult> dataResultLoaderListener
= new LoaderCallbacks<GetSyncListDataResult>() { ...methods here... };
private LoaderCallbacks<ErrorResult> errorResultLoaderListener
= new LoaderCallbacks<ErrorResult>() { ...methods here... };
Run Code Online (Sandbox Code Playgroud)
...并声明你的装载机ID ......
private static final int DATA_RESULT_LOADER_ID = 1;
private static final int ERROR_RESULT_LOADER_ID = 2;
Run Code Online (Sandbox Code Playgroud)
...然后初始化你的装载机......
getLoaderManager().initLoader(DATA_RESULT_LOADER_ID, dataResultBundle, dataResultLoaderListener);
getLoaderManager().initLoader(ERROR_RESULT_LOADER_ID, errorResultBundle, errorResultLoaderListener);
Run Code Online (Sandbox Code Playgroud)
......做完了!
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 ) {
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的Github示例
| 归档时间: |
|
| 查看次数: |
10622 次 |
| 最近记录: |