У меня есть активность, которая показывает фрагмент progress-bar, load-data и затем показывает его в новом фрагменте, скрывая фрагмент progress-bar.AsyncTask, прогресс и фрагменты
Я столкнулся с печально известной проблемой onPostExecute()/изменения конфигурации, и после прочтения многочисленных сообщений о возможных решениях я понял, что они не связаны с переходом фрагментов в onPostExecute(), что также может быть потенциально опасным, поскольку оно может throw 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(), а не разрушаемый фрагмент. –
Вы написали это - «проблема с изменением конфигурации ...» .. Я надеялся, что если вы прочитаете этот пост, вы найдете какое-то решение ... извините, но у меня нет другой идеи. –