当我在网络调用完成后尝试向IllegalStateException
添加参数时,我收到fragment
错误。崩溃发生在网络正在进行呼叫但尚未完成(慢速网络)并且您将活动带入后台(例如,说切换活动)
我需要将来自网络调用的数据传递给fragment
(将填充页面扩展器用于滚动图像的网址列表。
我的代码:
`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
}
最好的办法是防止这次崩溃吗?
编辑:
堆栈跟踪:
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 :(得分:2)
您的主要问题是您尚未取消请求。在您的情况下,它应该是onPause
方法。避免这样做,您至少可以将主要错误带到您的代码中:
以并行或更多相同的请求运行。例如,如果您在onResume中运行请求并且没有良好的网络连接然后退出/返回应用程序(通过按主页按钮),您将运行多个相同的请求,因为onResume将被多次调用,并且每个请求都需要一些时间。 / p>
正在运行" onComplete"回调处于Activity
(或Fragment
之类的任何其他组件)的不一致状态。假设您在onResume
中运行了请求,然后从应用程序退出。调用onPause
和onStop
。 onSaveInstanceState
也可以调用onDestroy
。然后您的请求会给出成功答案,并且您尝试为已停止并保存的活动运行一些片段。因此,您有例外。
如何解决 您只需在onPause中取消您的请求即可。最终,如果在调用回调之前退出应用程序,则将阻止在不一致状态下的调用。如果您重新进入应用程序,也会阻止相同的请求。