네트워크 호출이 완료된 후 IllegalStateException
인수를 추가하려고 하면 오류가 발생 fragment
합니다. 충돌은 네트워크가 통화를 수행하고 아직 완료되지 않은 상태 (느린 네트워크)에서 발생하며 활동을 백그라운드로 가져갑니다 (예 : 활동 전환).
네트워크 호출에서 가져온 데이터를 fragment
이미지 스크롤을 위해 페이지 래더를 채울 URL 목록 으로 전달해야합니다 .
내 코드 :
`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
}
이 충돌을 방지하는 가장 좋은 방법은 무엇입니까?
편집하다:
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)
가장 큰 문제는 요청을 취소하지 않았다는 것입니다. 귀하의 경우에는 onPause
방법 이어야합니다 . 이를 피하면 최소한 코드에 주요 오류를 가져올 수 있습니다.
동일한 요청 이상에 병렬로 실행됩니다. 예를 들어 onResume에서 요청을 실행하고 네트워크 연결 상태가 좋지 않은 다음 홈 버튼을 눌러 애플리케이션을 종료 / 돌아 가면 onResume이 여러 번 호출되고 각 요청에 시간이 걸리기 때문에 여러 동일한 요청이 실행됩니다.
불일치 상태 Activity
(또는 같은 다른 구성 요소 Fragment
) 에서 "onComplete"콜백을 실행 합니다. 요청을 실행 onResume
한 다음 애플리케이션을 종료 한다고 가정합니다 . onPause
그리고 onStop
호출됩니다. onSaveInstanceState
호출하고 아마도 onDestroy
너무. 그런 다음 요청이 성공 응답을 제공하고 이미 중지되고 저장된 활동에 대해 일부 조각을 실행하려고합니다. 따라서 예외가 있습니다.
해결 방법 onPause에서 요청을 취소하기 만하면됩니다. 결국 콜백이 호출되기 전에 애플리케이션을 종료하면 일관성없는 상태의 호출을 방지 할 수 있습니다. 또한 예를 들어 응용 프로그램에 재 입력하는 경우 동일한 요청이 늘어나는 것을 방지합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다