2013-08-03 46 views
1

我有一個活動,顯示一個進度條片段,加載數據,然後在隱藏進度條片段後顯示它在一個新的片段。AsyncTask,進度和片段

我遇到臭名昭着的onPostExecute()/配置更改問題,並且在閱讀了大量關於可能解決方案的文章後,我發現他們中沒有人處理在onPostExecute()中切換片段 - 這也可能具有潛在危險,在活動保存狀態後嘗試提交片段事務時拋出IllegalStateException。

這一塊的相關代碼:

public class MyActivity extends FragmentActivity implements { 

    class LoadListTask extends AsyncTask<Void, Void, MyListItem> { 

     @Override 
     protected void onPreExecute() { 
      showProgressBar(); 
     } 

     @Override 
     protected Response doInBackground(Void... params) { 
      // 
      // ... web call 
      // 
      return new List<MyListItem>; 
     } 

     protected void onPostExecute(List<MyListItem> result) { 
      if (result != null) { 
       hideProgressBar(); 
       showList(result); 
      } 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(...); 
     new LoadListTask().execute(session); 
    } 

    public void showProgressBar() { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager 
       .beginTransaction(); 

     fragmentTransaction.replace(R.id.placeholder, 
       mProgressBarFragment).commit(); 
     fragmentManager.executePendingTransactions(); 
    } 

    private void hideProgressBar() { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager 
       .beginTransaction(); 
     fragmentTransaction.remove(mProgressBarFragment) 
       .commit(); 
     fragmentManager.executePendingTransactions(); 
    } 

    private void showList(List<ListItem> list) { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager 
       .beginTransaction(); 

     Fragment frg = FacebookFriendPickerFragment 
       .newInstance(friendsArrObj); 
     fragmentTransaction.replace(R.id.friendPickerPlaceholder, frg) 
       .commit(); 
     fragmentManager.executePendingTransactions(); 
    } 
} 

我開始認爲有一個片段,僅僅顯示進度複雜的事情,但我真的想堅持片段 - 那麼,有什麼辦法以「同步」片段事務,以便在活動生命週期的合理階段發生,並避免AsyncTask/config-change問​​題?

回答

1

你需要把這個代碼到你的片段:

// Retain this fragment across configuration changes. 
setRetainInstance(true); 

更多關於處理與片段配置更改您可以在本教程中閱讀:

http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html

希望,我幫你。

+0

謝謝,我也讀過這篇文章,並嘗試setRetainInstance(true),當問題第一次出現時,但如預期的那樣,它只控制片段本身 - 而我的問題是活動需要切換片段onPostExecute (),而不是被破壞的片段。 –

+0

你寫過這個 - 「配置改變問題......」我希望如果你閱讀這篇文章,你會發現一些解決方案...抱歉,但我沒有任何其他的想法。 –