2014-12-04 76 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