2016-01-15 2 views
0

Я использую навигационный ящик, Fragment_1 содержит список, который ищет местоположение gps, а затем загружает адаптер. Процесс работает нормально, если я держу Fragment_1 открытым, пока он полностью не загрузится. Но если я попытаюсь открыть еще один фрагмент Fragment_2, а Fragment_1 будет искать местоположение или загрузить адаптер, мое приложение выйдет из строя. Fragment_2 хранит текстовое изображение и отлично работает, если его инициировать отдельно.Приложение сбой при запуске другого фрагмента из существующего фрагмента

Я использую следующий код для запуска новых фрагментов из ящика

Fragment mFragment; 
FragmentManager mFragmentManager = getSupportFragmentManager(); 
mFragment = new Fragment_2();         

mFragmentManager.beginTransaction() 
.replace(R.id.frame_container,mFragment) 
.commit(); 
+1

вставьте свой вывод logcat –

+0

Если сбой приложения, вы не должны публиковать свою ошибку logcat. Без этого мы можем только рассуждать о причине. – Rohit5k2

ответ

1

Вы должны сделать задачу Async для загрузки списка. Перед заменой текущего фрагмента просто отмените задачу async. Убедитесь, что вы выполнили проверку onPostExecute, если задача не отменена.

Здесь вы можете найти пример загрузки данных async в вид ресайклера: http://javatechig.com/android/android-recyclerview-example. Посмотрите на AsyncHttpTask. Вы можете видеть, что данные берутся и анализируются на doInBackground и отображаются в onPostExecute. Кроме того, необходимо добавить следующее в ваш код: вложить все в onPostExecute в

if (!isCancelled()) { 
    /* your code here for setting list adapter */ 
} 

переопределение на Detach:

@Override 
public void onDetach() { 
    super.onDetach(); 

    // don't update the UI if user go from this fragment 
    if (displayResultsAsyncTask != null && !displayResultsAsyncTask.isCancelled()) 
     displayResultsAsyncTask.cancel(true); 
} 

Так что ваш код должен выглядеть примерно так:

public class YourFragment extends Fragment { 
    // declare an async task in your fragment 
    private AsyncTask displayResultsAsyncTask = null; 
    /* other data here */ 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     /* your code for onCreate */ 
     GetAndDisplayResults(); // call display results 
    } 

    public void GetAndDisplayResults() { 
     displayResultsAsyncTask = new AsyncTask<String, Void, Integer>() { 
      @Override 
      protected Integer doInBackground(String... params) { 
       Integer result = 0; 

       // get and parse data, also set result 

       return result; 
      } 

      @Override 
      protected void onPostExecute(Integer result) { 
       if (!isCancelled()) { 
        // if task wasn't stopped 
        if (result == 1) 
         SetYourList(); // set your list adapter based on results returned from doInBackground 
       } 
      } 
     }.execute(); 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 

     // don't update the UI if user go from this fragment 
     if (displayResultsAsyncTask != null && !displayResultsAsyncTask.isCancelled()) 
      displayResultsAsyncTask.cancel(true); 
    } 
} 

Список, используемый для сохранения ваших данных, может быть объявлен глобальным и доступен как от doInBackground, так и от onPostExecute или может быть поставлен на onPostExecute в качестве параметра.

+0

Нет смысла делать это, если фрагмент нужно удалить. – Rohit5k2

+0

Я использую модификацию для загрузки списка, вы можете рассказать мне, как этого достичь? приложение вылетает после обнаружения местоположения и пытается загрузить адаптер. –

0

Похоже, что вы пытаетесь commitfragmentTransaction в одном из onCreate, onResume методов, которые вызывают исключение IllegalStateException: Can not perform this action after onSaveInstanceState из-за activity state loss. Проверьте, выполняете ли вы эти функции.

Надеюсь, это поможет.

+0

да, я называю это в своем onCreate, что может быть возможным решением? –

+0

'onPostResume()' будет для вас решением –

+0

Я использую модификацию для загрузки своего списка, не могли бы вы сказать, что можно сделать в этом случае. –

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