Android中对象Parcelable序列化细节浅谈

主要问题探讨:

  1. RuntimeException异常
  2. Parcelable序列化时,Bitmap和数组怎么处理
  3. 贴一下当时的案例代码
前言:

最近在学安卓,这两天在写一个小模块,具体功能是使用网络编程获取数据,并存储在listview内。

并且点击listview通过Intent传递数据,跳转到一个新的activity,这里传递数据就需要用到Parcelable或者序列化。

遭遇问题:

其中我遇到一个小问题,我的实体类中包含了Bitmap和Bitmap数组,一开始图方便我使用的是Serializable,

但是报了RuntimeException异常:

java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = com.example.admin.myapplication.com.StudentPI.Bean.PostInfo)
at android.os.Parcel.writeSerializable(Parcel.java:1394)
at android.os.Parcel.writeValue(Parcel.java:1341)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:644)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1313)
at android.os.Bundle.writeToParcel(Bundle.java:1034)
at android.os.Parcel.writeBundle(Parcel.java:669)
at android.content.Intent.writeToParcel(Intent.java:7485)
at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2411)
查了资料才发现, 如果需要实现Serializable接口,就必须使其内部所有对象都需要实现该接口。其中就包括Bitmap

我看了下Bitmap的源码,发现其实现了Parcelable接口。

RuntimeException解决方案:将实体类中所有对象都实现Serializable接口,或者换用Parcelable。

Bitmap和数组怎么处理:
案例中的实体类有bitmap和数组该怎么实现Parcelable这是我遇到的第二个问题,同样是在各大论坛找了很久才找到解决办法。
这里我只贴关键代码,avatar是Bitmap类型,attachment_urls为Bitmap数组,其余变量为String.
public static final Parcelable.Creator<PostInfo> CREATOR = new Creator<PostInfo>() {
    public PostInfo createFromParcel(Parcel source) {
        return new PostInfo(source);
    }
    public PostInfo[] newArray(int size) {
        return new PostInfo[size];
    }
};
@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    avatar.writeToParcel(dest,0);
    dest.writeString(author);
    dest.writeString(dateline);
    dest.writeString(subject);
    dest.writeParcelableArray(attachment_urls,flags);
}


同时贴一下传递信息和获取信息时的代码:
传递信息:
Intent intent = new Intent();
intent.putExtra("PostInfo", list.get(arg2));
//MainActivity为本类,DetailActivity为跳转目标类
intent.setClass(MainActivity.this, DetailActivity.class);
startActivity(intent);
       获取信息:
Intent intent = this.getIntent();
PostInfo postinfp = intent.getParcelableExtra("PostInfo");
这里提醒一下, 涉及activity跳转,不要忘了在AndroidManifest.xml中配置目标Activity信息
<activity android:name=".DetailActivity">
    <intent-filter>
        <action android:name="android.intent.action.detail"/>

        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值