panpf / sketch

Sketch is an image loading library designed for Compose Multiplatform and Android View. It is powerful and rich in functions. In addition to basic functions, it also supports GIF, SVG, video thumbnails, Exif Orientation, etc.
Apache License 2.0
2.01k stars 307 forks source link

displayoptions报错 #123

Closed FrankLove closed 4 years ago

FrankLove commented 4 years ago

在fragment里面使用此方法 mImageView.displayImage(filepath).getOptions().setLoadingImage(R.drawable.icon_default_image); getOptions()第二次显示图片的时候提示 java.lang.NullPointerException: Attempt to invoke virtual method 'me.panpf.sketch.request.DisplayOptions me.panpf.sketch.request.DisplayRequest.getOptions()' on a null object reference

panpf commented 4 years ago

如果不涉及到商业机密的话请把异常贴全

FrankLove commented 4 years ago

如果不涉及到商业机密的话请把异常贴全 @panpf 在activity里面每次切换显示图片都这么调用的话 mImageView.displayImage(filepath).getOptions().setLoadingImage(R.drawable.icon_default_image); 第二次就会刚才的错误 如果把占位图单独拿出来设置就正常 mImageView.getOptions().setLoadingImage(R.drawable.icon_default_image); mImageView.displayImage(filepath)

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.lancoo.listenclass, PID: 17686 java.lang.NullPointerException: Attempt to invoke virtual method 'me.panpf.sketch.request.DisplayOptions me.panpf.sketch.request.DisplayRequest.getOptions()' on a null object reference at com.test.fragment.ImageviewFragment.onCreateView(ImageviewFragment.java:67) at android.support.v4.app.Fragment.performCreateView(Fragment.java:2439) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460) at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852) at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:802) at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625) at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411) at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273) at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:733) at android.os.Handler.handleCallback(Handler.java:761) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:156) at android.app.ActivityThread.main(ActivityThread.java:6617) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)

panpf commented 4 years ago

首先设置 options 一定是要在 displayImage 之前才会生效

panpf commented 4 years ago

其次 displayImage 方法返回的是 DisplayRequest 是不支持修改 Options 的,你这么写有很大问题,是我 API 设计的问题让你误以为可以这样用,后续我会去掉 displayImage 的返回值

panpf commented 4 years ago

你这里的问题应该是第二次 displayImage 的时候可能是由于缺少 url 导致 commit 失败,返回了 null 的 DisplayRequest,你可以 debug 一下看看 displayImage 内部调用的 commit 方法,找到是哪里校验不过返回了 null

FrankLove commented 4 years ago

因为displayoptions说明文档里面并没有详细说明displayoptions应该怎么调用,所以我只能猜测着调用了。 我把他改成这样就没问题了 mImageView.getOptions().setLoadingImage(R.drawable.icon_default_image); mImageView.displayImage(filepath) @panpf