首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓活动恢复上的BadParcelableException

安卓活动恢复上的BadParcelableException
EN

Stack Overflow用户
提问于 2018-01-26 11:07:04
回答 1查看 336关注 0票数 0

我有一个活动,在它的onResume方法中加载一个片段

代码语言:javascript
复制
override fun onResume() {
    super.onResume()

    loadDietFragment()
}

fun loadDietFragment() {
  val uri = Uri.parse("${DatabaseContract.CONTENT_URI}/current")
  val currentDietCursor = contentResolver.query(uri , null, null, null, null )
  if(currentDietCursor.count > 0) {
      currentDietCursor.moveToFirst()
      currentDiet = DietEntity(currentDietCursor)
      currentDietCursor.close()
      loadHomeFragment()
      return
  }
}

private fun loadHomeFragment() {
        val transaction = supportFragmentManager.beginTransaction()
        val fragment = HomeFragment()
        val arguments = Bundle()
        arguments.putParcelable("diet", currentDiet)
        fragment.arguments = arguments

        transaction.replace(R.id.HomeFrameLayout, fragment)

        transaction.addToBackStack(null)
        transaction.commit()
    }

然后在片段中我有:

代码语言:javascript
复制
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        currentDiet = arguments.getParcelable("diet")
        preferences = PreferenceManager.getDefaultSharedPreferences(activity)
    }

它看起来很好,而且正在工作,但是当我收到带有此堆栈跟踪的BadParcelableException时,会出现一些罕见的情况:

代码语言:javascript
复制
   java.lang.RuntimeException: 
     at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2560)
     at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2630)
     at android.app.ActivityThread.-wrap11 (ActivityThread.java)
     at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1482)
     at android.os.Handler.dispatchMessage (Handler.java:111)
     at android.os.Looper.loop (Looper.java:207)
     at android.app.ActivityThread.main (ActivityThread.java:5736)
     at java.lang.reflect.Method.invoke (Native Method)
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:907)
     at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:768)
   Caused by: android.os.BadParcelableException: 
     at android.os.Parcel.readParcelableCreator (Parcel.java:2415)
     at android.os.Parcel.readParcelable (Parcel.java:2337)
     at android.os.Parcel.readValue (Parcel.java:2243)
     at android.os.Parcel.readArrayMapInternal (Parcel.java:2592)
     at android.os.BaseBundle.unparcel (BaseBundle.java:221)
     at android.os.Bundle.getParcelable (Bundle.java:786)
     at com.healthier_life.a90_days_diet.fragments.HomeFragment.onCreate    (HomeFragment.kt:59)
     at android.support.v4.app.Fragment.performCreate (Fragment.java:2339)
     at android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1377)
     at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState    (FragmentManager.java:1740)
     at android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1809)
     at android.support.v4.app.FragmentManagerImpl.dispatchStateChange    (FragmentManager.java:3217)
     at android.support.v4.app.FragmentManagerImpl.dispatchCreate (FragmentManager.java:3166)
     at android.support.v4.app.FragmentController.dispatchCreate (FragmentController.java:181)
     at android.support.v4.app.FragmentActivity.onCreate (FragmentActivity.java:319)
     at android.support.v7.app.AppCompatActivity.onCreate (AppCompatActivity.java:84)
     at com.healthier_life.a90_days_diet.activities.BaseActivity.onCreate    (BaseActivity.kt:18)
     at com.healthier_life.a90_days_diet.MainActivity.onCreate (MainActivity.kt:46)
     at android.app.Activity.performCreate (Activity.java:6278)
     at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1136)
     at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2513)

我不能一直复制它。它每天发生几次(谷歌播放统计),我只能在手机上看到它一次。我已经有几个小时没有使用这个应用了。我点击了应用程序图标,然后它就抛出了异常。

在目前的例子中有什么地方不对吗?我对如何修复bug或如何始终如一地复制它的建议持开放态度。谢谢!

编辑:我忘了共享DietEntity类:https://pastebin.com/EkT79ubT,它在pastebin中,因为它不允许我将那么多的代码放在一个包含大量文本的帖子中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-27 00:40:28

Android实际上有一个用于Parcelable实现的代码生成选项。对我来说最突出的是你的创建者可能没有被正确的实现。试着把它作为一个伙伴对象来做。也不需要将变量命名为像in这样的保留字,并且必须一直使用回刻字。

代码语言:javascript
复制
override fun writeToParcel(parcel: Parcel, flags: Int) {
    parcel.writeInt(id)
    parcel.writeLong(startDate.millis)
    parcel.writeLong(endDate.millis)
    parcel.writeString(type.toString())
    parcel.writeByte(if (skipWaterDay1) 1 else 0)
    parcel.writeByte(if (skipWaterDay2) 1 else 0)
    parcel.writeByte(if (skipWaterDay3) 1 else 0)
}

override fun describeContents(): Int = 0

companion object CREATOR : Parcelable.Creator<DietEntity> {
    override fun createFromParcel(parcel: Parcel): DietEntity = DietEntity(parcel)
    override fun newArray(size: Int): Array<DietEntity?> = arrayOfNulls(size)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48460141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档