在我的主要活动中,我有一个Fragment,我在其中应用了setRetainInstance(true),这样我使用的AsyncTask就不会因方向改变而受到干扰。
AsyncTask处理了大量工作。这就是为什么我想在我的活动之上显示一个带有progressBar的对话框。
我做了一些研究,并成功地使用了DialogFragment:
公共类DialogWait扩展了DialogFragment {
private ProgressBar progressBar;
public DialogWait() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.dialog_wait, container);
Dialog dialog = getDialog();
dialog.setTitle("Hello");
setCancelable(false);
progressBar = (ProgressBar) view.findViewById(R.id.progress);
return view;
}
public void updateProgress(int value) {
progressBar.setProgress(value);
}
这是我的AsyncTask:
public class InitAsyncTask extends AsyncTask<Void, Integer, Void> {
private Context activity;
private OnTaskDoneListener mCallback;
private DialogWait dialog;
public InitAsyncTask(Context context, OnTaskDoneListener callback, DialogWait dialogWait) {
activity = context;
mCallback = callback;
dialog = dialogWait;
}
@Override
protected Void doInBackground(Void... params) {
doStuff();
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
dialog.updateProgress(values[0]);
}
@Override
protected void onPostExecute(Void result) {
publishProgress(100);
if(dialog != null)
dialog.dismiss();
mCallback.onTaskDone();
}
private void doStuff() {
//...
}
}
如果我不更改屏幕旋转,它可以正常工作。但是,如果我这样做,对话框被解除,几秒钟之后,我得到了一个NullPointerEsception,因为我设置条件是无意义的:if(dialog!= null)
我做错了什么?
答案 0 :(得分:3)
找到解决方案!
我没有使用包含我的AsyncTask的Fragment做正确的事。
因为,我还没有真正理解Fragment中的方向概念,所以感谢这个链接:http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html
答案 1 :(得分:1)
覆盖onCreate
中的onDestroyView
和DialogWait
方法,如下所示:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public void onDestroyView() {
if (getDialog() != null && getRetainInstance()) {
getDialog().setDismissMessage(null);
}
super.onDestroyView();
}