无法从 onActivityReenter 中的 Intent 读取 Parcelable

Posted

技术标签:

【中文标题】无法从 onActivityReenter 中的 Intent 读取 Parcelable【英文标题】:Cannot read Parcelable from Intent in onActivityReenter 【发布时间】:2018-11-13 18:26:11 【问题描述】:

我想在Intent 中返回我的地址模型。如果我尝试在onAcivityResult 方法中获取我的地址模型一切正常,但在onActivityReenter 中我得到了这个Exception

Class not found when unmarshalling: ua.com.uklontaxi.models.UIAddress
java.lang.ClassNotFoundException: ua.com.myapp.models.UIAddress
    at java.lang.Class.classForName(Native Method)
    at java.lang.Class.forName(Class.java:324)
    at android.os.Parcel.readParcelableCreator(Parcel.java:2383)
    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)

其他地方没有这样的错误(比如onActivityResult在同一个Activity

如何解决?

附:我把我的模型放到Bundle,然后我把这个包放到Intent。我尝试在没有Bundle-wrapping 的情况下将地址放入Intent。这对我没有帮助。

【问题讨论】:

请发布更多堆栈跟踪。哪里出错了? 【参考方案1】:

这对我有帮助:

override fun onActivityReenter(resultCode: Int, data: Intent?) 
   super.onActivityReenter(resultCode, data)

   data?.setExtrasClassLoader(this.classLoader) // this is context!

【讨论】:

【参考方案2】:

对于仍然想知道为什么这个问题对于 API 版本低于 Oreo (8) 仍然存在的人,它与为 API 8+ 提供的修复有关。您可以找到官方修复 here 或者您可以查看以下代码(取自官方 repo):

Intent intent = mEnterActivityOptions.getResultData();
   if (intent != null) 
        intent.setExtrasClassLoader(activity.getClassLoader());
    
activity.onActivityReenter(result, intent);

本质上,在调用ActivityonActivityReenter(...);之前,手动将ClassLoader添加到Intent

【讨论】:

以上是关于无法从 onActivityReenter 中的 Intent 读取 Parcelable的主要内容,如果未能解决你的问题,请参考以下文章

无法从 Flutter 中的 Firebase Firestore 返回列表

无法从 R 中的 DF 更新 SQL Server 中的值

无法从 emgucv 中的视频中检测到人脸

无法从 UITest 中的 CollectionView 元素访问单元格

无法从情节提要中的 UITapGestureRecognizer 拖动 IBAction

无法从 IOS 中的 sqlite 获取值