bumptech / glide

An image loading and caching library for Android focused on smooth scrolling
https://bumptech.github.io/glide/
Other
34.59k stars 6.12k forks source link

NullPointerException: Attempt to invoke virtual method 'int com.b.a.i.ordinal()' on a null object reference #2658

Open gemiren opened 6 years ago

gemiren commented 6 years ago

This is a bug reported by users. Seems to be a random bug so far. I wasn't be able to get the bug reproduced yet. However, I get couple of bug reports on Firebase crash report every day. So I think it is worth to report the bug here and hopefully a fix soon. Thanks.

Glide Version: 4.3.1

Integration libraries: Android Architecture Components v1.0.0

Device/Android Version: Various devices and Android versions.

Issue details / Repro steps / Use case background:

Glide load line / GlideModule (if any) / list Adapter code (if any):

Glide.with...

Layout XML:

<FrameLayout xmlns:android="...

Stack trace / LogCat:

Exception java.lang.NullPointerException: Attempt to invoke virtual method 'int com.b.a.i.ordinal()' on a null object reference
com.bumptech.glide.load.engine.DecodeJob.getPriority (DecodeJob.java:204)
com.bumptech.glide.load.engine.DecodeJob.compareTo (DecodeJob.java:196)
com.bumptech.glide.load.engine.DecodeJob.compareTo (DecodeJob.java:37)
java.util.concurrent.PriorityBlockingQueue.siftUpComparable (PriorityBlockingQueue.java:322)
java.util.concurrent.PriorityBlockingQueue.offer (PriorityBlockingQueue.java:450)
java.util.concurrent.ThreadPoolExecutor.execute (ThreadPoolExecutor.java:1332)
com.bumptech.glide.load.engine.executor.GlideExecutor.execute (GlideExecutor.java:255)
com.bumptech.glide.load.engine.EngineJob.start (EngineJob.java:115)
com.bumptech.glide.load.engine.Engine.load (Engine.java:229)
com.bumptech.glide.request.SingleRequest.onSizeReady (SingleRequest.java:443)
com.bumptech.glide.request.target.ViewTarget$SizeDeterminer.getSize (ViewTarget.java:250)
com.bumptech.glide.request.target.ViewTarget.getSize (ViewTarget.java:89)
com.bumptech.glide.request.SingleRequest.begin (SingleRequest.java:257)
com.bumptech.glide.request.ErrorRequestCoordinator.begin (ErrorRequestCoordinator.java:26)
com.bumptech.glide.manager.RequestTracker.resumeRequests (RequestTracker.java:95)
com.bumptech.glide.RequestManager.resumeRequests (RequestManager.java:245)
com.bumptech.glide.RequestManager.onStart (RequestManager.java:268)
com.bumptech.glide.manager.ActivityFragmentLifecycle.onStart (ActivityFragmentLifecycle.java:50)
com.bumptech.glide.manager.SupportRequestManagerFragment.onStart (SupportRequestManagerFragment.java:175)
android.support.v4.app.Fragment.performStart (Fragment.java:2287)
android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManagerImpl.java:1458)
android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState (FragmentManagerImpl.java:1750)
android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManagerImpl.java:1819)
android.support.v4.app.BackStackRecord.executeOps (BackStackRecord.java:797)
android.support.v4.app.FragmentManagerImpl.executeOps (FragmentManagerImpl.java:2590)
android.support.v4.app.FragmentManagerImpl.executeOpsTogether (FragmentManagerImpl.java:2377)
android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute (FragmentManagerImpl.java:2332)
android.support.v4.app.FragmentManagerImpl.execPendingActions (FragmentManagerImpl.java:2239)
android.support.v4.app.FragmentManagerImpl$1.run (FragmentManagerImpl.java:700)
android.os.Handler.handleCallback (Handler.java:739)
android.os.Handler.dispatchMessage (Handler.java:95)
android.os.Looper.loop (Looper.java:158)
android.app.ActivityThread.main (ActivityThread.java:7225)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1230)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1120)
sjudd commented 6 years ago

Thanks for the report, let me know if you find a way to reproduce this.

Are you using any custom ModelLoaders or other components? Any custom executors?

disparate commented 5 years ago

Hello guys, I can see a lot of crashes with this error on my app. Can you help me with that? Glide Version: 4.8.0 Integration libraries: okhttp3-integration Device/Android Version: Various devices and Android versions. Glide load line:

GlideApp.with...

Here's stacktrace

Fatal Exception: java.lang.NullPointerException
Attempt to invoke direct method 'int com.bumptech.glide.load.b.g.h()' on a null object reference
  com.bumptech.glide.load.engine.DecodeJob.compareTo (DecodeJob.java:200)
  com.bumptech.glide.load.engine.DecodeJob.compareTo (DecodeJob.java:38)
  java.util.concurrent.PriorityBlockingQueue.siftUpComparable (PriorityBlockingQueue.java:360)
  java.util.concurrent.ThreadPoolExecutor.execute (ThreadPoolExecutor.java:1381)
  com.bumptech.glide.load.engine.executor.GlideExecutor.execute (GlideExecutor.java:268)
  com.bumptech.glide.load.engine.EngineJob.reschedule (EngineJob.java:273)
  com.bumptech.glide.load.engine.DecodeJob.reschedule (DecodeJob.java:362)
  com.bumptech.glide.load.engine.SourceGenerator.onDataReady (SourceGenerator.java:110)
  com.bumptech.glide.integration.okhttp3.OkHttpStreamFetcher.onResponse (OkHttpStreamFetcher.java:71)

And I also see a similar stacktrace, but there NPE happens inside a call to getPriority of a DecodeJob object.

Fatal Exception: java.lang.NullPointerException 
Attempt to invoke virtual method 'int com.bumptech.glide.i.ordinal()' on a null object reference
  com.bumptech.glide.load.engine.DecodeJob.getPriority (DecodeJob.java:208)
  com.bumptech.glide.load.engine.DecodeJob.compareTo (DecodeJob.java:200)
  com.bumptech.glide.load.engine.DecodeJob.compareTo (DecodeJob.java:38)
  java.util.concurrent.PriorityBlockingQueue.siftUpComparable (PriorityBlockingQueue.java:322)
  java.util.concurrent.ThreadPoolExecutor.execute (ThreadPoolExecutor.java:1332)
  com.bumptech.glide.load.engine.executor.GlideExecutor.execute (GlideExecutor.java:268)

GlideModule (if any): I do have a custom glide module class.

@GlideModule
class CustomAppGlideModule : AppGlideModule() {

    override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
        super.registerComponents(context, glide, registry)

        registerProgressListener(registry)
        registerGifDecoders(glide, registry)
        registerLottieThumbnailDecoders(glide, registry)
    }

    private fun registerGifDecoders(glide: Glide, registry: Registry) {
        val koralFileGifDecoder = KoralFileGifDecoder(registry.imageHeaderParsers, glide.arrayPool)
        registry.prepend(Registry.BUCKET_GIF, File::class.java, AppGifDrawable::class.java, koralFileGifDecoder)
    }

    private fun registerLottieThumbnailDecoders(glide: Glide, registry: Registry) {
        registry
            .append(
                LottieThumbnail::class.java,
                LottieCompositionPreview::class.java,
                LottieCompositionLoader.Factory(glide.context)
            )
            .append(
                LottieCompositionPreview::class.java,
                Bitmap::class.java,
                LottieBitmapDecoder(glide.context, glide.bitmapPool)
            )
    }

    private fun registerProgressListener(registry: Registry) {
        val client = OkHttpClient.Builder()
            .callTimeout(30, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS)
            .addNetworkInterceptor { chain ->
                val request = chain.request()
                val response = chain.proceed(request)
                val listener = DispatchingProgressListener()
                response.newBuilder()
                    .body(
                        OkHttpProgressResponseBody(
                            request.url(),
                            response.body()!!,
                            listener
                        )
                    )
                    .build()
            }
            .build()
        registry.replace(GlideUrl::class.java, InputStream::class.java, OkHttpUrlLoader.Factory(client))
    }

}
disparate commented 5 years ago

@sjudd Sorry for bothering, can you give me a hint, so I can continue investigating myself?

disparate commented 5 years ago

For those who will have the same issue, I fixed it. Now I don't see this crashes in crashlytics. After reading the discussion of the following issue https://github.com/bumptech/glide/issues/2204 I changed a bit implementation of my custom DataFetcher class. It used to call an async func in loadData and cancel method was not implemented. I changed it to sync and not calling onDataReady or onDataFailed if cancel was called before.