1

Я получаю ошибку IllegalStateException, когда пытаюсь добавить аргументы в fragment после завершения сетевого вызова. Авария происходит, когда сеть выполняет вызов и еще не завершена (медленные сети), и вы делаете активность в фоновом режиме (например, действия переключения)IllegalStateException при применении аргументов к фрагменту после сетевого ответа

Мне нужно передать данные, поступающие от сетевого вызова в fragment (список адресов, которые будут заселить pageradapter для прокрутки изображений

Мой код:.

`onResume` I do the network call by calling `doWebserviceCall();` 

После сетевого вызова я называю этот метод:

private void configureImageScroller() { 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    Bundle bundle = new Bundle(); 
    // Boolean to hide the thumbnails when the Scrolling images is embedded in the item activity 
    bundle.putBoolean(ScrollingTradeImagesFragment.INTENT_BOOL_EMBEDDED, false); 
    // Pass the object to the Scrolling images fragment 
    bundle.putParcelable(INTENT_KEY_TRADE_OBJECT, Parcels.wrap(mTradeItem)); 
    ScrollingTradeImagesFragment fragment = new ScrollingTradeImagesFragment(); 
    FragmentManager fm = getSupportFragmentManager(); 

    //-------Crash happens here-------// 
    fragment.setArguments(bundle); 
    fragmentTransaction.add(R.id.scrollable_image_container, fragment); 
    fragmentTransaction.commit(); 
    } 

метод, который запускается, когда сетевой вызов завершен:

 @Override 
    public void populateItemViews(final TradeItem aTradeItem) { 
    mTradeItem = aTradeItem; 
    // Do some stuff here that is irrelevant 
    configureImageScroller(); 
    // Do some other stuff here that is irrelevant 
    } 

Что лучший способ сделать это, чтобы предотвратить эту катастрофу?

EDIT:

StackTrace:

Fatal Exception: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
    at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1493) 
    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1511) 
    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:638) 
    at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:617) 
    at com.bidorbuy.app.item.ItemActivity.configureImageScroller(ItemActivity.java:112) 
    at com.bidorbuy.app.item.ItemActivity.populateItemViews(ItemActivity.java:233) 
    at com.bidorbuy.app.item.ItemPresenter.handleNetworkResponse(ItemPresenter.java:37) 
    at com.bidorbuy.app.network.NetworkManager$3.onResponse(NetworkManager.java:422) 
    at com.bidorbuy.app.network.NetworkManager$3.onResponse(NetworkManager.java:419) 
    at com.bidorbuy.app.network.volley.BobeRequest.deliverResponse(BobeRequest.java:127) 
    at com.bidorbuy.app.network.volley.BobeRequest.deliverResponse(BobeRequest.java:26) 
    at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) 
    at android.os.Handler.handleCallback(Handler.java:810) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:189) 
    at android.app.ActivityThread.main(ActivityThread.java:5529) 
    at java.lang.reflect.Method.invoke(Method.java) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:950) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745) 
+0

Что скажет стек? –

+0

@MikeM. см. править – x10sion

+2

Я думаю, что главное, что вы не отменяете ваш звонок. Если вы запустите сетевой вызов в OnResume, пожалуйста, отмените его в onPause. Вы отменяете вызов методом 'onPause'? –

ответ

2

Ваша главная проблема заключается в том, что вы не отменяя запрос. В вашем случае это должно быть метод. Избежать сделать это вы можете принести по крайней мере, основные ошибки в коде:

  • Запуск в parrallel или более же запросы. Например, если вы запускаете запрос в onResume и не имеете хорошего сетевого подключения, а затем выходите/возвращаетесь в приложение (нажав кнопку «домой»), у вас будет несколько одинаковых запросов, так как onResume будет вызываться несколько раз, и каждый запрос занимает некоторое время.

  • Выполнение обратного вызова «onComplete» в несогласованном состоянии Activity (или любой другой компонент, такой как Fragment). Предположим, что вы выполнили свой запрос в onResume, а затем вышли из приложения. и onStop. onSaveInstanceState вызывают и, вероятно, onDestroy тоже. Затем ваш запрос дает успешный ответ, и вы пытаетесь запустить фрагмент для активности, которая была остановлена ​​и сохранена. Таким образом, у вас есть исключение.

Как решить это Вам нужно просто отменить запрос в OnPause. В конце концов, если вы выйдете из приложения до того, как будет вызван обратный вызов, вы запретите invokation в несовместимом состоянии. А также предотвратит размножение одного и того же запроса, если вы, например, перейдете к приложению faslty.

+1

Спасибо, Майкл, у меня всегда было чувство, что это придет в игру, когда-то просто не нужно было его внедрять. Я думаю, его время! :) Спасибо за это, похоже, работает нормально. Это сделает приложение более надежным. Я называю это как знак, основанный на том, что кто-то еще видит это, они будут реализовывать его, даже если он не исправляет мою проблему (что выглядит по внешнему виду, оно есть). еще раз спасибо – x10sion

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

  • Нет связанных вопросов^_^