主要问题探讨:
- RuntimeException异常
- Parcelable序列化时,Bitmap和数组怎么处理
- 贴一下当时的案例代码
前言:
最近在学安卓,这两天在写一个小模块,具体功能是使用网络编程获取数据,并存储在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>