【问题标题】:How to recreate activity如何重新创建活动
【发布时间】:2019-09-24 10:19:25
【问题描述】:

我有活动和片段。我得到共享偏好。在我的片段中:

   private var dManager: DataManager?=null
   private lateinit var sp: SharedPreferences
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View?{
    val view = inflater.inflate(R.layout.fragment_test1_new_design, container, false)
    level = arguments!![Constants.LEVEL].toString()
    sp = activity!!.getSharedPreferences(Constants.APP_PREFERENCES, AppCompatActivity.MODE_PRIVATE)
    dManager = MyApp.gManager.getDataManager(sp,level,test)

有时我会收到崩溃报告

lateinit property sp has not been initialized

我在初始化之前不使用sp,所以这意味着activity!!.getSharedPreferences(Constants.APP_PREFERENCES, AppCompatActivity.MODE_PRIVATE)返回null。这是否意味着活动已被破坏?

如果我检查 sp == null,我应该在片段中进一步做什么?重新启动应用程序或重新创建活动?什么是正确的方法?

【问题讨论】:

  • 请显示完整代码
  • 如果你在片段中使用sp = activity!!.getSharedPreferences(),那么请不要在片段中使用activity/getActivity()来获取Context,因为如果你的fragment不是当前,activity/getActivity()会返回null附加到父 activity
  • @NileshRathod 是正确的,但如果活动是null 并且由于!! 而不允许其余代码块执行,它应该已经崩溃。请分享一个更大的代码 sn-p,是在传递 sharedPreferences 之前初始化吗?
  • @Giorgos Neokleous 我分享了更多代码。使用 sp 之前没有初始化。崩溃发生在不到 0.5% 的情况下。我觉得可以和内存清理联系起来,但是不明白怎么防止这个crash(检查sp和其他lateinit属性后怎么办)
  • @Nilesh Rathod 谢谢,但我应该怎么做呢?

标签: android kotlin activity-lifecycle kotlin-lateinit


【解决方案1】:

解决这个问题的一种方法是调用:

if(!::sp.isInitialized) {
    sp = activity!!.getSharedPreferences(Constants.APP_PREFERENCES, AppCompatActivity.MODE_PRIVATE)
    dManager = MyApp.gManager.getDataManager(sp,level,test)
}

在片段的onStart()方法中。

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 2019-09-21
    • 2015-11-25
    • 2021-04-28
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多