【问题标题】:Passing HashMap of JavaMail Messages to Android activities将 JavaMail 消息的 HashMap 传递给 Android 活动
【发布时间】:2014-03-21 01:24:27
【问题描述】:

我正在制作 android 应用程序,我必须在其中存储/恢复作为 JavaMail 消息的 HashMAp 的数据,但我收到以下错误:

02-20 08:11:25.650: E/AndroidRuntime(2264): FATAL EXCEPTION: main
    02-20 08:11:25.650: E/AndroidRuntime(2264): java.lang.RuntimeException: Parcel: unable to marshal value com.sun.mail.imap.IMAPMessage@40e36828
02-20 08:11:25.650: E/AndroidRuntime(2264):     at android.os.Parcel.writeValue(Parcel.java:1235)
02-20 08:11:25.650: E/AndroidRuntime(2264):     at android.os.Parcel.writeArray(Parcel.java:641)
02-20 08:11:25.650: E/AndroidRuntime(2264):     at android.os.Parcel.writeValue(Parcel.java:1220)
02-20 08:11:25.650: E/AndroidRuntime(2264):     at android.os.Parcel.writeMapInternal(Parcel.java:591)
02-20 08:11:25.650: E/AndroidRuntime(2264):     at android.os.Parcel.writeMap(Parcel.java:575)
02-20 08:11:25.650: E/AndroidRuntime(2264):     at android.os.Parcel.writeValue(Parcel.java:1166)
02-20 08:11:25.650: E/AndroidRuntime(2264):     at android.os.Parcel.writeMapInternal(Parcel.java:591)
02-20 08:11:25.650: E/AndroidRuntime(2264):     at android.os.Bundle.writeToParcel(Bundle.java:1627)
02-20 08:11:25.650: E/AndroidRuntime(2264):     at android.os.Parcel.writeBundle(Parcel.java:605)
02-20 08:11:25.650: E/AndroidRuntime(2264):     at com.example.androidtablayout.SimpleParcelable.writeToParcel(SimpleParcelable.java:57)
</code>

MailActivity.java

在 onSaveInstanceState 中,我将哈希图保存在 SimpleParcelable 类中。保存和恢复的代码是:

@Override
    protected void onSaveInstanceState(Bundle outState) {
        Log.i("mustang", "Saving activity states. size : " + emailsMap.size());
        if(emailsMap.size() > 0)
        {
            outState.putParcelable("parcel", new SimpleParcelable(emailsMap));
        }

        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle state) {
        // TODO Auto-generated method stub

        Log.i("mustang", "Restoring activity states.");

        super.onRestoreInstanceState(state);

        SimpleParcelable stateParcel = state.getParcelable("parcel");
        emailsMap = (HashMap<String, Message[]>)stateParcel.getEmailsMap();
        this.emailsFetched(emailsMap.get("INBOX"), "INBOX", TaskType.NONE);
    }

序列化代码 SimpleParcelable 是:

公共类 SimpleParcelable 实现 Parcelable{
    私人最终地图 emailsMap;
    公共 SimpleParcelable(HashMap 消息)
    {
        emailsMap = 消息;
    }

    公共静态最终 Parcelable.Creator CREATOR
        = 新 Parcelable.Creator() {

            @覆盖
            public SimpleParcelable createFromParcel(Parcel source) {
                捆绑 rBundle = source.readBundle();
                return new SimpleParcelable((HashMap)rBundle.getSerializable("map"));
            }

            @覆盖
            公共 SimpleParcelable[] newArray(int size) {
                // TODO 自动生成的方法存根
                返回新的 SimpleParcelable[大小];
            }
        };
    @覆盖
    公共 int describeContents() {
        // TODO 自动生成的方法存根
        返回0;
    }

    @覆盖
    公共无效writeToParcel(包裹目的地,int标志){
        捆绑 b = 新捆绑();
        b.putSerializable("map", (HashMap)emailsMap);

        dest.writeBundle(b);
    }

    公共地图 getEmailsMap()
    {
        返回电子邮件地图;
    }
}

谁能指出做错了什么?如果有什么问题,请告诉我如何实现代码的编组和解组?

提前致谢。

【问题讨论】:

    标签: java android marshalling unmarshalling parcelable


    【解决方案1】:

    在您的 onSaveInstanceState 方法中,您试图从一个或多个 com.sun.mail.imap.IMAPMessage 实例中创建一个 Parcel,其中不包括 Parcellable 接口。您尝试打包的所有实例都必须实现此接口。

    【讨论】:

    • 从您的评论看来,IMAPMessage 似乎没有实现 Parcellable 接口。我怎样才能做到这一点?很抱歉这种天真的方法,因为我是这个平台的新手。代码会有很大帮助。谢谢
    猜你喜欢
    • 2015-01-26
    • 2016-04-13
    • 2016-08-08
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    相关资源
    最近更新 更多