我在我的应用程序中使用loader来执行后台操作。由于我想支持Orientation和Locale以及其他配置更改,我更喜欢选择Loader。
在我的应用程序中,我有一个列表,用户可以选择多个列表项,在他点击动作模式项时处理一些动作。我希望每次用户点击此动作模式项时执行/处理此动作。作为我我正在处理数据到SD卡中的文件,我不想在操作完成后将数据保存在加载器中。
如果没有方向更改或活动位于最顶层,下面写的Loader工作正常。
当方向更改/活动在后台时,onLoadFinished()不会被调用。因此,进度始终可见。从观察中发现onLoadFinished虽然传递了结果但未被调用。
我不想一次又一次地初始化/重新启动加载器。因为我依赖于传递所选列表项。
任何人都可以建议我如何确保在loadInBackground.TIA之后始终调用onLoadFinished()。
CODE:
LOADER CALLBACK CLASS:
class ExtractingLoaderManager implements LoaderManager.LoaderCallbacks<String> {
private List<Integer> mSelectionList;
ExtractingLoaderManager(List<Integer> list) {
mSelectionList = list;
}
@Override
public Loader<String> onCreateLoader(int id, Bundle args) {
showProgressBar();
return new ExtractLoader(MyActivity.this, mSelectionList, mListAdapter, progressDialog);
}
@Override
public void onLoadFinished(Loader<String> loader, String data) {
Logger.i(TAG, "EL : onLoadFinished");
Toast.makeText(MyActivity.this, data, Toast.LENGTH_LONG).show();
data =null;
dismissProgressBar();
}
@Override
public void onLoaderReset(Loader<String> loader) {
}
}
从行动模式中拨打电话点击:
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
if (item.getItemId() == R.id.action_extract) {
//Logger.i(TAG, "onActionItemClicked: Extract");
ArrayList<Integer> mArrayList = new ArrayList<Integer>();
mArrayList.addAll(mListAdapter.getSelectedList());
getLoaderManager().initLoader(4, null, new ExtractingLoaderManager(mArrayList));
mode.finish();
}
LOADER CLASS:
public class ExtractLoader extends AsyncTaskLoader<String> {
private static final String TAG = ExtractLoader.class.getSimpleName();
private List<Integer> mList, mTempList;
private Context mContext;
private ListAdapter mAdapter;
private ProgressDialog progressDialog;
String message = null;
ExtractLoader(Context context, List<Integer> list, ListAdapter adapter, ProgressDialog progressDialog) {
super(context);
mList = list;
mAdapter = adapter;
mContext = context;
this.progressDialog = progressDialog;
}
@Override
protected void onStartLoading() {
Logger.i(TAG, "EL :onStartoading : " + takeContentChanged() + " : " + message);
if (takeContentChanged() || message == null) {
Logger.i(TAG, "EL : onStartoading : forceLoad");
forceLoad();
}
}
@Override
public String loadInBackground() {
Logger.i(TAG, "EL :loadInBackground");
for (int i = 0; i < mList.size(); i++) {
new Utils().letsExtract(mAdapter.getData().get(mList.get(i)));
publish(i);
}
if (mList.size() == 1) {
message = new String("single entry / Success condition");
} else {
message = new String("Multiple entry / some other condition");
}
return message;
}
public void publish(int i) {
Logger.i(TAG, "EL :publish Progress: " + i);
}
@Override
protected void onForceLoad() {
super.onForceLoad();
Logger.i(TAG, "onForceLoadCalled");
}
@Override
public void stopLoading() {
cancelLoad();
Logger.i(TAG, "EL :stopLoading");
}
@Override
protected void onReset() {
Logger.i(TAG, "EL :onReset");
stopLoading();
}
@Override
public void deliverResult(String data) {
if (isReset()) {
return;
}
if (isStarted()) {
super.deliverResult(data);
Logger.i(TAG, "EL :deliverResult");
}
}
}
编辑:
由于列表器未连接到laoder,我在onCreate中启动加载器并在onActionItemCLicked()中重新启动加载器。 当解决方向改变时,这解决了装载机的问题。
当设备被锁定和解锁时,问题仍然存在,并且用户恢复活动加载器onLoadFinished不会被调用。