【问题标题】:Android 5.1 : Attempt to write to field 'java.util.ArrayList android.animation.AnimatorSet$Node.nodeDependents' on a null object referenceAndroid 5.1:尝试在空对象引用上写入字段“java.util.ArrayList android.animation.AnimatorSet$Node.nodeDependents”
【发布时间】:2015-05-21 08:17:02
【问题描述】:

java.lang.NullPointerException:尝试在空对象引用上写入字段“java.util.ArrayList android.animation.AnimatorSet$Node.nodeDependents”

我在从 Android 5.0 迁移到 5.1 后遇到了这个问题,当我尝试使用克隆的 LayoutInflater 进行充气时会发生此问题。如果我只使用常规布局充气器就可以了。这种膨胀也发生在带有 threadPool 执行器的后台线程上,因为出于性能原因需要两个相同的布局同时膨胀。如果我切换到使用序列化执行器也可以。

final LayoutInflater bgLayoutInflater = layoutInflater.cloneInContext(getContext());
final ViewGroup rootView = (ViewGroup) bgLayoutInflater.inflate(resourceId, null, false);

link to the AOSP where crash happens, line 699

有什么想法吗?

【问题讨论】:

  • 这感觉像是一个愚蠢的建议,所以我在评论而不是答案中说。您是否尝试过对项目进行干净构建?在 Android Studio 中,单击 Build > Clean Project。如果您在更改 API 时实际上没有更改任何代码,这可能只是一些奇怪的参考问题。
  • 没有建议是愚蠢的,虽然它不能解决我的问题。@Chamatake-san

标签: java android


【解决方案1】:

所以最后我自己解决了这个问题。不管新的 5.1 AOSP 更改应该返回一个更好的错误来告诉我出了什么问题,我在后台线程中夸大了一个大布局,风险自负。

这就是我相信发生的事情。

final LayoutInflater layoutInflater = (LayoutInflater)
            getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

我需要以最快的时间对两个大布局(每个 600 毫秒)进行充气,因此我决定使用带有 threadPoolExecutor 的 asyncTask 来执行两个充气任务。但我无法实现它,因为 SystemService 中的 layoutInflater 是同步。所以我做了一个克隆充气机,直到 5.1 才解决了这个问题。

现在我可以修复它了

 final LayoutInflater layoutInflater = LayoutInflater.from(getContext()); 

这样每个充气机都在并行执行自己的工作。同样,我仍然冒着在 UI 线程上膨胀的风险,将来新的更新可能仍会在某个地方破坏它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多