2014-12-04 68 views
0

我正在使用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:附加图像,以帮助澄清我在做什么:

enter image description here

+0

哪里实际片段交易代码?它何时发生? – stkent 2014-12-04 13:50:52

+0

片段不应该与片段进行通信,特别是不要启动它们,因为它们基本上是线程中的线程。你想要做的是在第一个片段的活动上创建一个方法,使用getActivity()。startSecondFragment(yourdata)让主线程安全地启动第二个片段。片段应该始终通过父母的活动进行交流。 – 2014-12-04 13:58:00

+0

对不起,我没有解释我自己。通信正在使用MainActivity进行。所以主要活动接收信号显示第二个片段,然后它添加它。 – Sonhja 2014-12-04 14:00:37

回答

0

你的旧片段仍连接到您的AsyncTaskonPostExecute没有完成。我没有看到你在你的AsyncTas k里有它,但我会假设你有。在AsyncTaskOnPostExecute方法完成之后,您需要进行转换。

试试这个:

取下您的当前片段(在OnPostExecute),并通过调用FragmentManager和commiting新片段替换另一个。在DoInBackground的某个点上执行此操作的方法只是返回此布尔值并让OnPostExecute完成此过程。

而且它是一个良好的初步实践,以遵循AsyncTask的guideliness和执行所有相关方法(其中4个是精确的)

+0

但我希望两个片段在同一时间线上共存。我在其他项目中也是这样做的,但是对于这个特定的项目不起作用... – Sonhja 2014-12-04 13:58:49