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問題?
謝謝,我也讀過這篇文章,並嘗試setRetainInstance(true),當問題第一次出現時,但如預期的那樣,它只控制片段本身 - 而我的問題是活動需要切換片段onPostExecute (),而不是被破壞的片段。 –
你寫過這個 - 「配置改變問題......」我希望如果你閱讀這篇文章,你會發現一些解決方案...抱歉,但我沒有任何其他的想法。 –