使用_binding!!当我在联网后使用绑定时会产生 NPE

Posted

技术标签:

【中文标题】使用_binding!!当我在联网后使用绑定时会产生 NPE【英文标题】:Using _binding!! makes NPE when I use binding after networking 【发布时间】:2021-05-04 22:03:24 【问题描述】:

https://developer.android.com/topic/libraries/view-binding

我在fragment中使用了View Binding作为官方文档。 联网后,这段代码导致NPE。

私有 val 绑定 get() = _binding!! (行:62)

我在 onCreateView 初始化了 _binding,并在 onStart 尝试联网。以下代码是联网后的。

 override fun getTimeSuccess(challengeTimeResponse: ChallengeTimeResponse) 
    when (challengeTimeResponse.code) 
        1000 -> 
            binding.timerStart.visibility = View.INVISIBLE //(line:256)
            ... ... 

这是我的错误日志。

Fatal Exception: kotlin.KotlinNullPointerException
   at com.alice.timer_at_home.src.timer.TimerFrag.getBinding(TimerFrag.kt:62)
   at com.alice.timer_at_home.src.timer.TimerFrag.getTimeSuccess(TimerFrag.kt:256)
   at com.alice.timer_at_home.src.timer.TimerService$getChallengeTime$1.onResponse(TimerService.kt:80)
   at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1$1.run(DefaultCallAdapterFactory.java:83)
   at android.os.Handler.handleCallback(Handler.java:883)
   at android.os.Handler.dispatchMessage(Handler.java:100)
   at android.os.Looper.loop(Looper.java:237)
   at android.app.ActivityThread.main(ActivityThread.java:7811)
   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:1068)

此错误并不总是发生,但有时会发生。为什么会这样?我应该怎么做才能解决这个问题?

【问题讨论】:

您需要更多详细信息 - 请显示绑定标记 【参考方案1】:

如文章所述,绑定只在 onCreateView 和 onDestroyView 之间有效。

// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!

您提到您在联网后调用此代码。我想 NPE 有两个可能的原因:

    网络请求在片段销毁后完成。要解决这个问题,你应该取消 onDestroyView 中的所有请求。或者在 onStop 中与 onStart 对称。

    getTimeSuccess 从后台线程调用。我无法从问题描述中验证这一点。但如果是这种情况,那么 _binding 有时可能会因为thread variables visibility 而为空。要解决这个问题,你应该把工作切换到主线程。

【讨论】:

谢谢!我正在使用改造网络。所以也许你回答的第一个原因是导致 NPE。我试图通过用 if (_bindindind != null) 包装它来解决这个问题。这是个好方法吗? 用检查包装异步代码是可以的。但另外,我建议您在片段被销毁时取消网络请求。取消请求也将有助于解决可能的内存泄漏。 (proandroiddev.com/…) 这很有帮助。谢谢~ @alice 欢迎您!您可以将答案标记为已接受,以便其他人看到问题已解决。您还可以通过奖励我十个额外的积分来提高答案评级。但这取决于你;)

以上是关于使用_binding!!当我在联网后使用绑定时会产生 NPE的主要内容,如果未能解决你的问题,请参考以下文章

ComposeView 与视图绑定

为啥我会收到带有 std::bind() 的“本地临时返回地址”警告?

当我在存储过程中使用相同的公式计算日期时,日期值格式不同 - 雪花

如何使用样式数据绑定?

如何使用 context.bind 绑定 DataSource。连接池等

JQuery_事件基础