我有以下类,它从一个包中读取和写入一个对象数组:
class ClassABC extends Parcelable {
MyClass[] mObjList;
private void readFromParcel(Parcel in) {
mObjList = (MyClass[]) in.readParcelableArray(
com.myApp.MyClass.class.getClassLoader()));
}
public void writeToParcel(Parcel out, int arg1) {
out.writeParcelableArray(mObjList, 0);
}
private ClassABC(Parcel in) {
readFromParcel(in);
}
public int describeContents() {
return 0;
}
public static final Parcelable.Creator<ClassABC> CREATOR =
new Parcelable.Creator<ClassABC>() {
public ClassABC createFromParcel(Parcel in) {
return new ClassABC(in);
}
public ClassABC[] newArray(int size) {
return new ClassABC[size];
}
};
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我ClassCastException在阅读时得到readParcelableArray:
ERROR/AndroidRuntime(5880):引起:java.lang.ClassCastException:[Landroid.os.Parcelable;
上面的代码有什么问题?在编写对象数组时,我应该先将数组转换为ArrayList? …
我有一个实现Parcelable接口的类:
class A implements Parcelable {
}
Run Code Online (Sandbox Code Playgroud)
我有另一个类B包含一个A对象作为实例变量.在writeToPacel内部类B,我想写对象B为Parcel:
class B implements Parcelable{
public void writeToParcel(Parcel dest, int flags) {
dest.write ???
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么写和读它?
为什么捆绑getParcelableArrayList,getParcelable方法; 但
Intent只有putParcelableArrayListExtra方法?我可以只传输object<T>,而不是ArrayList一个元素吗?那么,是getParcelable为了什么?
我得到了Parcelable的一个实现,它适用于一个不涉及继承的单个类.在进行继承时,我在确定实现接口的最佳方法时遇到了问题.假设我得到了这个:
public abstract class A {
private int a;
protected A(int a) { this.a = a; }
}
public class B extends A {
private int b;
public B(int a, int b) { super(a); this.b = b; }
}
Run Code Online (Sandbox Code Playgroud)
问题是,这是为B实现Parcelable接口的推荐方法(在A?中都有??如何?)
我有一个字符串的通用映射(键,值),这个字段是我需要可以分配的Bean的一部分.所以,我可以使用Parcel#writeMap方法.API Doc说:
请改用writeBundle(Bundle).在当前dataPosition()中将Map展平到parcel中,如果需要,增加dataCapacity().Map键必须是String对象.Map值使用writeValue(Object)编写,并且必须遵循其中的规范.强烈建议使用writeBundle(Bundle)而不是此方法,因为Bundle类提供了一个类型安全的API,允许您在编组时避免神秘的类型错误.
因此,我可以迭代我的Map中的每个条目并将其放入Bundle中,但我仍然在寻找一种更聪明的方法.我缺少Android SDK中的任何方法吗?
目前我这样做:
final Bundle bundle = new Bundle();
final Iterator<Entry<String, String>> iter = links.entrySet().iterator();
while(iter.hasNext())
{
final Entry<String, String> entry =iter.next();
bundle.putString(entry.getKey(), entry.getValue());
}
parcel.writeBundle(bundle);
Run Code Online (Sandbox Code Playgroud) 如何使用不是来自 kotlin-android-extensions 插件的 Parcelize替换annotation class Parcelizefrom package kotlinx.android.parcel?
关于我的代码示例,如果一个Locable的变量为null,我会做什么?例如,现在如果l.getZoom()返回null,我得到NullPointerException.
@Override
public void writeToParcel(Parcel parcel, int arg1) {
parcel.writeInt(count);
for(Locable l:locableArr){
parcel.writeInt(l.getOriginId());
parcel.writeInt(l.getLocableType());
parcel.writeInt(l.getZoom());
parcel.writeDouble(l.getLatituda());
parcel.writeDouble(l.getLongituda());
parcel.writeString(l.getTitle());
parcel.writeString(l.getSnipet());
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
我有一些实现Parcelable的类,其中一些类作为属性互相包含.我正在将类编组为一个包,以便在活动之间传递它们.将它们编组到包裹中工作正常,但是当我尝试解组它们时,我收到以下错误:
...
AndroidRuntime E Caused by: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: schemas.Arrivals.LocationType
AndroidRuntime E at android.os.Parcel.readParcelable(Parcel.java:1822)
AndroidRuntime E at schemas.Arrivals.LayoverType.<init>(LayoverType.java:121)
AndroidRuntime E at schemas.Arrivals.LayoverType.<init>(LayoverType.java:120)
AndroidRuntime E at schemas.Arrivals.LayoverType$1.createFromParcel(LayoverType.java:112)
AndroidRuntime E at schemas.Arrivals.LayoverType$1.createFromParcel(LayoverType.java:1)
AndroidRuntime E at android.os.Parcel.readTypedList(Parcel.java:1509)
AndroidRuntime E at schemas.Arrivals.BlockPositionType.<init>(BlockPositionType.java:244)
AndroidRuntime E at schemas.Arrivals.BlockPositionType.<init>(BlockPositionType.java:242)
AndroidRuntime E at schemas.Arrivals.BlockPositionType$1.createFromParcel(BlockPositionType.java:234)
AndroidRuntime E at schemas.Arrivals.BlockPositionType$1.createFromParcel(BlockPositionType.java:1)
...
Run Code Online (Sandbox Code Playgroud)
该LayoverType班(其中它的失败):
public class LayoverType implements Parcelable {
protected LocationType location;
protected long start;
protected long end;
public LayoverType() {}
public LocationType getLocation() …Run Code Online (Sandbox Code Playgroud) 我一直在阅读很多文章和文章,颂扬Parcelable在Serializable上的速度.我一直在使用两种方法来通过Intents在Activities之间传递数据,并且在两者之间切换时还没有注意到任何速度差异.我必须传输的典型数据量是5到15个嵌套对象,每个对象有2到5个字段.
由于我有大约30个必须可转移的类,因此实现Parcelable需要大量的样板代码来增加维护时间.我目前的要求之一是编译的代码应该尽可能小; 我希望通过使用Serializable over Parcelable可以节省一些空间.
我应该使用Parcelable还是没有理由在Serializable上使用它来处理这么少量的数据?还是有另一个原因我不应该使用Serializable?
我有一个ArrayList自定义对象,我希望能够在屏幕上保存和恢复旋转.
我知道,这是可以做到的onSaveInstanceState和onRestoreInstanceState如果我让ArrayList自己的类,它实现了无论是Parcelable还是Serializable......但是,有没有办法做到这一点,而无需创建另一个类?
android ×10
parcelable ×10
bundle ×2
java ×2
annotations ×1
arraylist ×1
inheritance ×1
kotlin ×1
marshalling ×1
object ×1
serializable ×1