解组意外抛出异常抛出异常,但只在onActivityReenter期间

问题描述:

我只是试图实现onActivityReenter在重新输入转换运行之前执行特殊的UI更新。我硬是把块从onActivityResult请求代码,并将其分成2个部分,一部分进入onActivityReenter,对方呆在那里:解组意外抛出异常抛出异常,但只在onActivityReenter期间

BEFORE: (onActivityResult) 
      if (resultCode == RESULT_OK) { 
       // replace the MatchPlaySubmit model 
       data?.let { 
        this.dataBinding.submitModel = data.getMatchPlaySubmitModel() 
        val profIndex = data.getMatchPlayFinalProfileIndex() 
        dataBinding.matchPlay.matchPlayPicker.jumpToProfileNumber(profIndex + 1) 
        this.updatePickerView() 
       } 
      } 


override fun onActivityReenter(resultCode: Int, data: Intent?) { 
    if (resultCode == RESULT_OK && data != null) { 
     // makes sure that the data is from pager, since there no request code 
>  if (data.getStringExtra("source") == "mppager") { // causes CRASH 
      val profIndex = data.getMatchPlayFinalProfileIndex() 
      dataBinding.matchPlay.matchPlayPicker.jumpToProfileNumber(profIndex + 1) 
     } 
    } 
} 

AFTER: (onActivityResult) 
      if (resultCode == RESULT_OK) { 
       // replace the MatchPlaySubmit model 
       data?.let { 
        this.dataBinding.submitModel = data.getMatchPlaySubmitModel() 
        this.updatePickerView() 
       } 
      } 

然而,新的代码onActivityReenter总是会导致崩溃。崩溃就好像我没有正确设置类加载器的额外功能。但是,我只是添加到kotlin扩展func以确保extras的classloader被设置为我的。然而,崩溃总是会发生。

inline internal fun Intent.setMatchPlaySubmitModel(model: MatchPlaySubmitModel?) { 
    this.putExtra("@[email protected]", model) 
    this.setExtrasClassLoader(MatchPlaySubmitModel::class.java.classLoader) 
} 

android.os.BadParcelableException:ClassNotFoundException的时 解组:letstwinkle.com.twinkle.api.MatchPlaySubmitModel 在android.os.Parcel.readParcelableCreator(Parcel.java:2535) 在android.os .Parcel.readParcelable(Parcel.java:2461) at android.os.Parcel.readValue(Parcel.java:2364) at android.os.Parcel.readArrayMapInternal(Parcel.java:2717) at android.os.BaseBundle .unparcel(BaseBundle.java:269) at android.os.BaseBundle.getString(Bas eBundle.java:992) 在android.content.Intent.getStringExtra(Intent.java:6211) 在letstwinkle.com.twinkle.MatchPlayActivity.onActivityReenter(MatchPlayActivity.kt:1123)

测试API 24

看起来,框架转换实现有一个糟糕的情况。目前没有“好”的解决方案。可能的解决方法是避免将您的应用程序定义的类放入结果意图的任何方法。我选择的方式是针对那个类(幸运的是只有一个),删除Parcelable实现并从Intent和writeToIntent方法提供构造函数:

constructor(intent: Intent) { 
    playID = intent.getStringExtra("@[email protected]") 
    chosenProfileID = intent.getStringExtra("@[email protected]") 
    extraChosenProfileID = intent.getStringExtra("@[email protected]") 
    passed = intent.getBooleanExtra("@[email protected]", false) 
    shout = intent.getStringExtra("@[email protected]") 
    extraShout = intent.getStringExtra("@[email protected]") 
} 
fun writeToIntent(intent: Intent) { 
    intent.putExtra("@[email protected]", playID) 
    intent.putExtra("@[email protected]", chosenProfileID) 
    intent.putExtra("@[email protected]", extraChosenProfileID) 
    intent.putExtra("@[email protected]", passed) 
    intent.putExtra("@[email protected]", shout) 
    intent.putExtra("@[email protected]", extraShout) 
}