material-components-android: [BaseTransientBottomBar] 1.1.0-rc01 causes View.invalidate(boolean) NullPointerException

Description: After updating from Material 1.0.0 to 1.1.0-rc01 I saw multiple reports of crashes with BaseTransientBottomBar (and no app specific code in stacktrace). Stacktraces look like: Huawei Android 7

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.invalidate(boolean)' on a null object reference
       at android.view.View.setFlags + 11550(View.java:11550)
       at android.view.View.setVisibility + 8046(View.java:8046)
       at com.google.android.material.snackbar.BaseTransientBottomBar$9.run + 849(BaseTransientBottomBar.java:849)
       at android.os.Handler.handleCallback + 761(Handler.java:761)
       at android.os.Handler.dispatchMessage + 98(Handler.java:98)
       at android.os.Looper.loop + 156(Looper.java:156)
       at android.app.ActivityThread.main + 6617(ActivityThread.java:6617)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run + 942(ZygoteInit.java:942)
       at com.android.internal.os.ZygoteInit.main + 832(ZygoteInit.java:832)

Samsung Android 9

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.invalidate(boolean)' on a null object reference
       at android.view.View.setFlags + 15721(View.java:15721)
       at android.view.View.setVisibility + 10789(View.java:10789)
       at com.google.android.material.snackbar.BaseTransientBottomBar$9.run + 849(BaseTransientBottomBar.java:849)
       at android.os.Handler.handleCallback + 873(Handler.java:873)
       at android.os.Handler.dispatchMessage + 99(Handler.java:99)
       at android.os.Looper.loop + 214(Looper.java:214)
       at android.app.ActivityThread.main + 7094(ActivityThread.java:7094)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run + 494(RuntimeInit.java:494)
       at com.android.internal.os.ZygoteInit.main + 975(ZygoteInit.java:975)

Xiaomi Android 9

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.invalidate(boolean)' on a null object reference
       at android.view.View.setFlags + 14186(View.java:14186)
       at android.view.View.setVisibility + 10007(View.java:10007)
       at com.google.android.material.snackbar.BaseTransientBottomBar$9.run + 849(BaseTransientBottomBar.java:849)
       at android.os.Handler.handleCallback + 873(Handler.java:873)
       at android.os.Handler.dispatchMessage + 99(Handler.java:99)
       at android.os.Looper.loop + 201(Looper.java:201)
       at android.app.ActivityThread.main + 6823(ActivityThread.java:6823)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run + 547(RuntimeInit.java:547)
       at com.android.internal.os.ZygoteInit.main + 873(ZygoteInit.java:873)

LGE Android 9

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.invalidate(boolean)' on a null object reference
       at android.view.View.setFlags + 14222(View.java:14222)
       at android.view.View.setVisibility + 10027(View.java:10027)
       at com.google.android.material.snackbar.BaseTransientBottomBar$9.run + 849(BaseTransientBottomBar.java:849)
       at android.os.Handler.handleCallback + 873(Handler.java:873)
       at android.os.Handler.dispatchMessage + 99(Handler.java:99)
       at android.os.Looper.loop + 193(Looper.java:193)
       at android.app.ActivityThread.main + 6854(ActivityThread.java:6854)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run + 493(RuntimeInit.java:493)
       at com.android.internal.os.ZygoteInit.main + 860(ZygoteInit.java:860)

(if needed I can find few more stacktrace, but they seem to differ just by line numbers)

Expected behavior: BaseTransientBottomBar should not cause crashes/NPE

Steps to reproduce are unfortunately unknown, it seems to be relatively rare. The issue did not happen in 1.0.0

Material Library version: 1.1.0-rc01

Device: Multiple Devices/Android OS versions affected.

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Reactions: 2
  • Comments: 25 (10 by maintainers)

Commits related to this issue

Most upvoted comments

Having same issue on Android 5, with com.google.android.material:material:1.4.0

 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.invalidate(boolean)' on a null object reference
        at android.view.View.setFlags(View.java:9682)
        at android.view.View.setVisibility(View.java:6663)
        at android.widget.FrameLayout.setVisibility(FrameLayout.java:208)
        at com.google.android.material.snackbar.BaseTransientBottomBar$10.run(BaseTransientBottomBar.java:896)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5221)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

Fyi: Some issues are still present, see https://github.com/material-components/material-components-android/pull/1938. E.g.

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.invalidate(boolean)' on a null object reference
       at android.view.View.setFlags(View.java:15710)
       at android.view.View.setVisibility(View.java:10777)
       at com.google.android.material.snackbar.BaseTransientBottomBar$10.run(BaseTransientBottomBar.java:896)
       at android.os.Handler.handleCallback(Handler.java:873)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:214)
       at android.app.ActivityThread.main(ActivityThread.java:6981)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)

As a possible workaround you might use implementation 'com.github.material-components:material-components-android:d9fa78f176' as jitpack-dependency, in that version the NPEs are resolved.

@wcshi since the issue is only partially resolved, you might open this issue again.

Further information: I managed to artificially reproduce it.

Not sure if the view hierarchy is important for this bug, but I’m writing it down just in case:

The hierarchy was Activity>CoordinatorLayout as content>Fragment1 that after navigation tap switched to Activity>CoordinatorLayout as content>Fragment2 with ViewPager that displayed > Fragment3 with viewPager > that displayed Fragment4 In my artificial way Fragment4 did call Snackbar immediately in onResume, then 2 frames later it did call Snackbar again which caused a crash. Snackbar used CoordinatorLayout from Activity as an container.

After throttling the calls to Snackbar I was no longer able to reproduce the issue. (worth noting that even with this convoluted setup it was reproducible on Huawei, but not reproducible on emulator nor Pixel - it is known to happen also at least on Samsung, LG, Xiamoi, Motorola Rockhip so maybe it requires different timing).

There seem to be no good reason to call Snackbar twice in such a short period though, so I’ll change this in our app (and let you know if that was sufficient). (There is probably also no good enough reason for such a deep fragment hierarchy 😄 )

I think the earliest version that includes the fix is 1.6.0-alpha02. : )

Unfortunately I’m not a project member or maintainer and I haven’t looked into it. Perhaps someone else knows more.

@carstenhag this version is working on Android 10 & 11 but I’m still seeing issues on earlier versions (Android 8 & 9) - anyway to workaround that? Do you know on which version it started? Maybe it’ll be best to revert back to it…