2013-08-03 2 views
1

У меня есть активность, которая показывает фрагмент 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?

ответ

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

Вы написали это - «проблема с изменением конфигурации ...» .. Я надеялся, что если вы прочитаете этот пост, вы найдете какое-то решение ... извините, но у меня нет другой идеи. –

Смежные вопросы