我有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)
,但没有任何变化。