方向更改后或设备锁定后不调用onLoadFinished()

时间:2014-11-03 05:09:45

标签: android android-5.0-lollipop android-loadermanager android-loader

我在我的应用程序中使用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不会被调用。

0 个答案:

没有答案