Android Kotlin lateinit属性未初始化崩溃排查求助
问题分析:lateinit属性运行时变回未初始化导致崩溃
问题背景
我们的Android项目采用Kotlin开发,所有Fragment均继承自BaseFragment,HomeActivity作为启动Activity并提供通用功能。在BaseFragment的onCreate方法中调用HomeActivity的hideNavigationMenu时,触发kotlin.UninitializedPropertyAccessException,提示lateinit属性homeActivityBinding未初始化。该崩溃已在Firebase Crashlytics上报200+次,但本地无法复现。HomeActivity是首个启动的Activity,崩溃并非启动时触发,而是在运行一段时间后出现,无法理解已初始化的lateinit属性为何会变回未初始化状态。
相关代码
HomeActivity代码
class HomeActivity : HomeActivityContract.View { private val presenter: HomeActivityContract.Presenter by inject { parametersOf(Schedulers.computation()) } override val selectedWatchList: WatchlistItem get() = homeActivityBinding.watchlistSpinner.selectedWatchList override val watchlistItems: MutableList<WatchlistItem> get() = homeActivityBinding.watchlistSpinner.watchlistItems val bag = CompositeDisposable() lateinit var homeActivityBinding: ActivityHomeBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (presenter.hasAccount) { homeActivityBinding = ActivityHomeBinding.inflate(layoutInflater) setContentView(homeActivityBinding.root) Observables.combineLatest( realtimeDatabaseService.enableMaintenancePageForPhone, realtimeDatabaseService.maintenanceDate ) { isEnabled, _mMsg -> if (isEnabled) { homeActivityBinding.homeMaintenanceView.root.visibility = View.VISIBLE homeActivityBinding.homeParentView.visibility = View.GONE homeActivityBinding.homeMaintenanceView.maintenanceTV.text = getString(R.string.maintenance_msg, _mMsg) } else { homeActivityBinding.homeMaintenanceView.root.visibility = View.GONE homeActivityBinding.homeParentView.visibility = View.VISIBLE presenter.attachView(this) presenter.dataProvider.getAccountUpdate() .subscribeBy(onError = { it.printStackTrace() }, onNext = { presenter.sendDeviceIdForCurrentAccount(isNotificationsEnabledInSettings) }).disposeBy(lifecycle.disposers.onDestroy) setSupportActionBar(homeActivityBinding.homeToolbar) presenter.start() } } .subscribe() .disposeBy(lifecycle.disposers.onDestroy) } else { val intent = Intent(this, LoginActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) } startActivity(intent) finish() } } fun hideNavigationMenu() { homeActivityBinding.homeNavigationView.visibility = View.GONE // 此处提示homeActivityBinding未初始化 } }
BaseFragment代码
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (isAdded) parentFragmentManager.let { fragmentManager -> takeIf { fragmentManager.backStackEntryCount >= 1 }?.let { (activity as? HomeActivity)?.hideNavigationMenu() } } }
崩溃报告
Caused by kotlin.UninitializedPropertyAccessException: lateinit property homeActivityBinding has not been initialized at com.app.android.traderpro.etx.activities.homeActivity.HomeActivity.G5(HomeActivity.kt:7) at com.app.android.traderpro.etx.activities.homeActivity.HomeActivity.hideNavigationMenu(HomeActivity.kt:404) at com.app.android.traderpro.etx.fragments.BaseFragment.hideNavigationMenu(BaseFragment.kt:138) at com.app.android.traderpro.etx.fragments.BaseFragment.onCreate(BaseFragment.kt:153) at androidx.fragment.app.Fragment.performCreate(Fragment.java:3090) at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:475) at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:257) at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:113) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1424) at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2968) at androidx.fragment.app.FragmentManager.dispatchCreate(FragmentManager.java:2875) at androidx.fragment.app.FragmentController.dispatchCreate(FragmentController.java:252) at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:220) at com.app.android.traderpro.etx.activities.BaseActivity.onCreate(BaseActivity.kt:61) at com.app.android.traderpro.etx.activities.homeActivity.HomeActivity.onCreate(HomeActivity.kt:134) at android.app.Activity.performCreate(Activity.java:8207) at android.app.Activity.performCreate(Activity.java:8191) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3819) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4022) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2336) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:246) at android.app.ActivityThread.main(ActivityThread.java:8653) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
恳请各位帮忙分析已初始化的lateinit属性为何会再次变为未初始化状态。
内容的提问来源于stack exchange,提问作者srisindhu saride
相关产品推荐
相关产品推荐

