我在android上的Fragment上使用AsyncTask
。在其doInBackground...
它做了很多事情。但在某些时候,布尔标志设置为特定值,该标志使另一个Fragment
出现在第一个上。
它似乎正在出现,但由于AsyncTask
仍然有效,因此直到它结束才会显示。
这是我的代码:
public interface OnDoStuff() {
public void doSomeStuff();
}
public void setOnDoStuff(OnDoStuff onDoStuff) {
interfacedoStuff = onDoStuff;
}
// My ASYNC CLASS
whileEnded=false;
@Override
protected MyObjectParams[] doInBackground(MyObjectParams... params) {
if (whileEnded)
publishProgress(params);
if (backgroundTimes > 10)
whileEnded = true;
if (whileEnded) publishProgress(params);
// Do some other stuff
}
@Override
protected void onProgressUpdate(MyObjectParams[]... values) {
myInterface.doSomeStuff();
}
这种沟通很好。正在添加片段。但是直到流程结束才会显示它。在这里我附上片段:
public class FragmentShowAnimation extends Fragment {
RelativeLayout layout;
ImageView imageView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
layout = new RelativeLayout(this.getActivity());
layout.setLayoutParams(new RelativeLayout.LayoutParams(
LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT));
layout.setBackgroundColor(Color.parseColor("#CCCDCDCD"));
imageView = new ImageView(this.getActivity());
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
params.addRule(RelativeLayout.CENTER_IN_PARENT);
imageView.setLayoutParams(params);
imageView.setBackgroundResource(R.drawable.animated_background);
AnimationDrawable frameAnimation = (AnimationDrawable) imageView.getBackground();
if (frameAnimation != null) {
frameAnimation.start();
}
layout.addView(imageView);
return layout;
}
}
此片段在UI上显示动画图层。
但似乎我的片段正在显示,但在AsyncTask的末尾。知道我做错了吗?
编辑:我忘记了我的MainActivity的过渡......就在这里。
@Override
public void onDoStuff() {
getFragmentManager().beginTransaction().add(messagingLayout).commit();
}
EDIT2 :附图以帮助澄清我正在做的事情:
答案 0 :(得分:0)
在您onPostExecute
的{{1}}未完成之前,您的旧片段仍会附加。我没有看到你在AsyncTask
k中有它,但我认为你有。 AsyncTas
的{{1}}方法完成后,您想要的转换正在进行。
试试这个:
分离当前片段(在AsyncTask
中)并通过调用FragmentManager并提交新片段将其替换为另一片段。在OnPostExecute
的某个点执行此操作的方法只是返回此布尔值,并让OnPostExecute
完成此过程。
遵循DoInBackground
的指南并实施所有相关方法(其中4个是准确的)是一个很好的实践