Android ViewGroup崩溃:尝试从空对象引用字段'int android.view.View.mViewFlags'中读取

我们已经发现了由后端日志logging监视报告的这种崩溃的几种情况。 看起来崩溃并不与特定的用户体验失败联系在一起。 从报告来看,我们自己的class级没有任何标志(没有任何class级名称的标志)。 这是一个典型的崩溃的例子:

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) 

有谁知道是否有相关的错误loginAndroid代码?

可能的scheme

我有同样的问题。 我设置了一个animation并在onAnimationEnd我正在删除已经animation,这是什么时候出现问题的对象。 我所做的是设置一个asynchronous的 Runnable在animation停止之后等待100毫秒,然后移除animation对象:

先前animation的对象是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); } 

干杯

我面临同样的问题。 我用Handler解决了。

 new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { // remove fragment from here } }); 

问题出在ViewGroupdispatchDraw()方法中。 这个方法试图绘制所有ViewGroup的子ViewGroup 。 当一个孩子为null ,你会得到一个exception,这很可能来自这一行 : if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE) { (注意mViewFlags )。

所以问题在于你的某个视图在某个地方没有正确初始化。 我担心这是我能做的最好的事情。

我们也意外地发现了这个错误。 它被追踪到片段animation成为问题。 更具体地说,当应用程序是针对Local Maven repository for Support Libraries构build时,在片段事务中使用replace()定制animationrev> 26。

可能的scheme

降级Local Maven repository for Support Libraries rev 26.请参阅此处

可能的原因:我有完全相同的问题。 事实certificate,当我添加代码来修改onDraw()调用中的视图树时就开始发生了。 具体来说,当我的派生onDraw()满足特定的条件时,我删除了一个视图。 我现在认为这是一件坏事,可能是因为该平台试图绘制我现在已经从视图树中删除的视图。 我通过在调用onDraw()完成后发布带有Runnable的删除来解决该问题。