Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android ViewGroup crash: Attempt to read from field 'int android.view.View.mViewFlags' on a null object reference

We have found several cases for this kind of crashes reported by backend logging monitoring. It seems the crashes do not tie to particular UX failure. And from the reports, there is no sign of how our own classes being involved(no sign of any of our classes names). Here is an example of typical crashes:

java.lang.NullPointerException: Attempt to read from field 'int android.view.View.mViewFlags' on a null object reference  at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3357)  at android.view.View.updateDisplayListIfDirty(View.java:14288)  at android.view.View.getDisplayList(View.java:14315)  at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3549)  at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3528)  at android.view.View.updateDisplayListIfDirty(View.java:14253)  at android.view.View.getDisplayList(View.java:14315)  at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3549)  at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3528)  at android.view.View.updateDisplayListIfDirty(View.java:14253)  at android.view.View.getDisplayList(View.java:14315)  at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3549)  at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3528)  at android.view.View.updateDisplayListIfDirty(View.java:14253)  at android.view.View.getDisplayList(View.java:14315)  at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3549)  at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3528)  at android.view.View.updateDisplayListIfDirty(View.java:14253)  at android.view.View.getDisplayList(View.java:14315)  at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3549)  at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3528)  at android.view.View.updateDisplayListIfDirty(View.java:14253)  at android.view.View.getDisplayList(View.java:14315)  at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3549)  at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3528)  at android.view.View.updateDisplayListIfDirty(View.java:14253)  at android.view.View.getDisplayList(View.java:14315)  at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3549)  at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3528)  at android.view.View.updateDisplayListIfDirty(View.java:14253)  at android.view.View.getDisplayList(View.java:14315)  at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3549)  at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3528)  at android.view.View.updateDisplayListIfDirty(View.java:14253)  at android.view.View.getDisplayList(View.java:14315)  at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3549)  at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3528)  at android.view.View.updateDisplayListIfDirty(View.java:14253)  at android.view.View.getDisplayList(View.java:14315)  at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:273)  at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:279)  at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:318)  at android.view.ViewRootImpl.draw(ViewRootImpl.java:2561)  at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2377)  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2007)  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1086)  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6453)  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:846)  at android.view.Choreographer.doCallbacks(Choreographer.java:647)  at android.view.Choreographer.doFrame(Choreographer.java:601)  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:829)  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:5254)  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:927)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:713)  

Does anyone know whether there is related bug logged against Android code?

like image 930
M2014 Avatar asked Oct 20 '15 17:10

M2014


2 Answers

Possible Solution

I had this same issue. I setup an animation and in onAnimationEnd I was removing the object that had been animated which is when problems started. What I did was setup an asynchronous Runnable to wait 100 milliseconds after the animation had stopped before removing the animated object:

the object previously animated is this._loader

private void removeLoader() {     final ContentContainer self = this; // "CustomContainer" needs to match the type of `this`     Handler h = new Handler();     h.postAtTime(new Runnable() {         @Override         public void run() {             MainActivity.instance.runOnUiThread(new Runnable() {                  @Override                 public void run() {                     try {                         if(self._loader == null) {                             // there is no loader. quit now while you still have the chance!!                             return;                         }                         while(self._loader.getParent() != null) {                             removeView(self._loader);                         }                     } catch(Exception e) {                         Crashlytics.logException(e);                         e.printStackTrace();                     }                      self._loader = null;                 }             });         }     }, 100); } 

Cheers

like image 171
Jacksonkr Avatar answered Sep 18 '22 14:09

Jacksonkr


I was facing same problem. I resolved with Handler.

new Handler(Looper.getMainLooper()).post(new Runnable() {                 @Override                 public void run() {                    // remove fragment from here                 }             }); 
like image 45
Pawan Chaurasiya Avatar answered Sep 19 '22 14:09

Pawan Chaurasiya