使用 _binding!!当我在联网后使用绑定时使 NPE
Using _binding!! makes NPE when I use binding after networking
https://developer.android.com/topic/libraries/view-binding
我在fragment中使用了View Binding作为官方文档。
联网后,这段代码造成了NPE。
private val binding get() = _binding!! (line: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.onResponse(TimerService.kt:80)
at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall.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)
这个错误并不总是发生,但有时会发生。为什么会这样?我应该怎么做才能解决这个问题?
如文章所述,绑定仅在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 而为 null。为了解决这个问题,你应该把工作切换到主线程。
https://developer.android.com/topic/libraries/view-binding
我在fragment中使用了View Binding作为官方文档。 联网后,这段代码造成了NPE。
private val binding get() = _binding!! (line: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.onResponse(TimerService.kt:80)
at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall.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)
这个错误并不总是发生,但有时会发生。为什么会这样?我应该怎么做才能解决这个问题?
如文章所述,绑定仅在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 而为 null。为了解决这个问题,你应该把工作切换到主线程。