当我快速重新打开之前的片段时,getBinding 返回 null (NullPointerException)

问题描述 投票:0回答:1

我对 getBinding 有疑问。我的 BaseFragment 实现在这里:

private var _binding: T? = null
protected val binding get() = _binding!!


override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = inflate(inflater, container, false)
        return binding.root
    }

override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }

问题是,当我意识到这个场景时: 片段 1 -> 片段 2 -> 快速回到片段 1 -> 然后出现 NullPointerException

如果我在 onDestroyView 中删除

_binding = null
就可以了,但它可能会导致内存泄漏。

所以我的问题是为什么会出现这个异常?我的绑定应该每次在 onCreateView 中初始化

UPDT:

这是包含错误的完整日志:

Process: com.***.***, PID: 23789
                                                                                                        java.lang.NullPointerException
                                                                                                          at com.android.*.ui.webview.QuoteFragment.getBinding(QuoteFragment.kt:23)
                                                                                                          at com.android.*.ui.webview.QuoteFragment.access$getBinding(QuoteFragment.kt:20)
                                                                                                          at com.android.*.ui.webview.QuoteFragment$WebClient.onPageStarted(QuoteFragment.kt:109)
                                                                                                          at WV.nZ.c(chromium-TrichromeWebViewGoogle6432.aab-stable-599311133:16)
                                                                                                          at WV.V6.handleMessage(chromium-TrichromeWebViewGoogle6432.aab-stable-599311133:505)
                                                                                                          at android.os.Handler.dispatchMessage(Handler.java:106)
                                                                                                          at android.os.Looper.loopOnce(Looper.java:210)
                                                                                                          at android.os.Looper.loop(Looper.java:299)
                                                                                                          at android.app.ActivityThread.main(ActivityThread.java:8293)
                                                                                                          at java.lang.reflect.Method.invoke(Native Method)
                                                                                                          at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556)
                                                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1045)
android kotlin nullpointerexception android-databinding android-viewbinding
1个回答
0
投票

getBinding 上出现空指针的原因,您可能正在使用

handler.postDelay
snackbar

当您按下后退按钮,而 Handler、Snackbar、Animation 或 CountdownTimer 仍在工作时,Binding 将崩溃。

为了避免这种情况,您需要在关闭片段时取消它们。例如:

private val handler = Handler(Looper.getMainLooper())
private lateinit var runnable: Runnable


runnable = Runnable {
 //do your delay job
}

handler.postDelayed(runnable, 600)


//onStop and/or Back pressed add this code
if (this::runnable.isInitialized) {
  handler.removeCallbacks(runnable)
}
© www.soinside.com 2019 - 2024. All rights reserved.