我对 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)
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)
}