我已经使用这种模式有一段时间了。这里是一个非常牵强的例子,展示了AsyncTask和进度指示器的结合:
new AsyncTask<Void, Void, Void>() {
WeakReference<MyFragment> weakFragment = new WeakReference<MyFragment>(MyFragment.this);
@Override
protected void onPreExecute() {
Fragment fragment = weakFragment.get();
if(fragment != null) fragment.getView().findViewById(R.id.progress).setVisibility(View.VISIBLE);
}
@Override
protected Document doInBackground(Void... params) {
Fragment fragment = weakFragment.get();
if(fragment == null) return null;
// Do something ...
}
@Override
protected void onPostExecute() {
Fragment fragment = weakFragment.get();
if(fragment != null) fragment.getView().findViewById(R.id.progress).setVisibility(View.GONE);
}
}.execute();
方向变化时它的效果很好,但我注意到当我将片段从后台堆栈弹出时,片段非空但fragment.getView()为null。这显然会导致崩溃。你们在使用什么方法?我似乎找不到完美的解决方案。重要说明,这是在一个片段中,在其onActivityCreated(...)中调用setRetainInstance(true);
。