在ProgressDialog解雇时,活动有时会被关闭

时间:2015-01-06 08:37:07

标签: android listview android-fragments android-asynctask progressdialog

我有Activity带有标签式用户界面,我在其中通过ViewPagerAdapter加载3个片段。 1个片段(称为C)是一个简单的PreferenceFragment,1(B)只是TextView,最后一个(A)扩展Fragment,我用它来显示ListView包含设备上所有已安装的软件包。

当用户打开应用程序时,片段A中的AsyncTask会加载包,并准备好适配器以传递给ListView。此外,我在AsyncTask中使用ProgressDialog来通知用户列表已经准备就绪。

我给你留下了一些代码:

片段C中的内部AsyncTask:

private class AppListTask extends AsyncTask<Void, Integer, List<Map<String, Object>>> {

    Context context;

    public AppListTask(Activity context) {
        this.context = context;
    }

    @Override
    protected void onPreExecute() {
        progressDialog = new ProgressDialog(context);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setCanceledOnTouchOutside(false);
        progressDialog.setCancelable(true);
        progressDialog.show();
        progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialogInterface) {
                AppListTask.this.cancel(true);
            }
        });
    }

    @Override
    protected List<Map<String, Object>> doInBackground(Void... voids) {

        // get list of apps
        progressDialog.setMax(list.size());
        int nApps = 1;
        for(ResolveInfo info : list) {
            //work on info
            nApps++;
            publishProgress(nApps);
        }
        //return
     }

    @Override
    protected void onProgressUpdate(Integer... progress) {
        progressDialog.setProgress(progress[0]);
    }

    @Override
    protected void onPostExecute(List<Map<String, Object>> items) {
        if (progressDialog != null && progressDialog.isShowing()) {
            if (!((Activity) context).isFinishing() && !((Activity) context).isDestroyed()) {
                progressDialog.dismiss();
                progressDialog = null;
            }
        }
        //set adapter on list view
    }
}

我从Fragment C中的onActivityReady执行它

private ProgressDialog progressDialog;

...


@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    if (listAdapter == null || listAdapter.isEmpty()) {
        new AppListTask(getActivity()).execute();
    }
}

@Override
public void onPause() {
    if (progressDialog != null && progressDialog.isShowing()) {
        progressDialog.dismiss();
    }
    super.onPause();
}

...

问题是,在Note4上它完美地工作,而在Galaxy S5上发生了一些奇怪的事情。

如果我第一次打开应用程序,只要ProgressDialog被解除(在onPostExecute中),应用程序就会自动关闭,没有例外。在第二次或第三次发射时,它运作良好。 如果我根本不使用ProgressDialog,它在首次启动时效果很好。

我还尝试将ProgressDialog用作setCancelable(false),但没有任何变化。

0 个答案:

没有答案