Skip to content

Commit 64f3ca9

Browse files
Kamil Godlewskimeta-codesync[bot]
authored andcommitted
fix: get image info before creating drawable to avoid IllegalStateException (#2839)
Summary: ## Motivation This PR aims to mitigate crash caused by `IllegalStateException` thrown due to closable image reference being already closed when getting the image info. The crash is reported as #2826. On my end with version 3.6.0 I get following stack trace ``` java.lang.IllegalStateException: null at com.facebook.common.internal.Preconditions.checkState(Preconditions.java:162) at com.facebook.drawee.backends.pipeline.PipelineDraweeController.getImageInfo(PipelineDraweeController.java:366) at com.facebook.drawee.backends.pipeline.PipelineDraweeController.getImageInfo(PipelineDraweeController.java:64) at com.facebook.drawee.controller.AbstractDraweeController.reportSuccess(AbstractDraweeController.java:849) at com.facebook.drawee.controller.AbstractDraweeController.onNewResultInternal(AbstractDraweeController.java:667) at com.facebook.drawee.controller.AbstractDraweeController.-$$Nest$monNewResultInternal at com.facebook.drawee.controller.AbstractDraweeController$2.onNewResultImpl(AbstractDraweeController.java:600) at com.facebook.datasource.BaseDataSubscriber.onNewResult(BaseDataSubscriber.java:51) at com.facebook.datasource.AbstractDataSource$1.run(AbstractDataSource.java:200) at android.os.Handler.handleCallback(Handler.java:959) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loopOnce(Looper.java:257) at android.os.Looper.loop(Looper.java:342) at android.app.ActivityThread.main(ActivityThread.java:9634) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:619) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:929) ``` To mitigate the crash I moved reading image info before creating drawable from it and to be also surrounded by try-catch. ## Test Plan Unfortunately I can't provide a test plan since the exception is thrown most likely due to some race condition. Pull Request resolved: #2839 Reviewed By: defHLT Differential Revision: D87565917 Pulled By: oprisnik fbshipit-source-id: 4f6b09e88f0f660149eb8fbc9a57e784fdf9e14f
1 parent 47aba6f commit 64f3ca9

1 file changed

Lines changed: 5 additions & 4 deletions

File tree

‎drawee/src/main/java/com/facebook/drawee/controller/AbstractDraweeController.java‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,9 @@ private void onNewResultInternal(
647647
isFinished ? Event.ON_DATASOURCE_RESULT : Event.ON_DATASOURCE_RESULT_INT);
648648
// create drawable
649649
Drawable drawable;
650+
INFO info;
650651
try {
652+
info = getImageInfo(image);
651653
drawable = createDrawable(image);
652654
} catch (Exception exception) {
653655
logMessageAndImage("drawable_failed @ onNewResult", image);
@@ -665,11 +667,11 @@ private void onNewResultInternal(
665667
logMessageAndImage("set_final_result @ onNewResult", image);
666668
mDataSource = null;
667669
getSettableDraweeHierarchy().setImage(drawable, 1f, wasImmediate);
668-
reportSuccess(id, image, dataSource);
670+
reportSuccess(id, info, dataSource);
669671
} else if (deliverTempResult) {
670672
logMessageAndImage("set_temporary_result @ onNewResult", image);
671673
getSettableDraweeHierarchy().setImage(drawable, 1f, wasImmediate);
672-
reportSuccess(id, image, dataSource);
674+
reportSuccess(id, info, dataSource);
673675
// IMPORTANT: do not execute any instance-specific code after this point
674676
} else {
675677
logMessageAndImage("set_intermediate_result @ onNewResult", image);
@@ -846,8 +848,7 @@ private void reportIntermediateFailure(Throwable throwable) {
846848
getControllerListener2().onIntermediateImageFailed(mId);
847849
}
848850

849-
private void reportSuccess(String id, @Nullable T image, @Nullable DataSource<T> dataSource) {
850-
INFO info = getImageInfo(image);
851+
private void reportSuccess(String id, @Nullable INFO info, @Nullable DataSource<T> dataSource) {
851852
getControllerListener().onFinalImageSet(id, info, getAnimatable());
852853
getControllerListener2().onFinalImageSet(id, info, obtainExtras(dataSource, info, null));
853854
}

0 commit comments

Comments
 (0)