java - 如何在 Parcel 中使用 writeStringArray() 和 readStringArray()

标签 java android marshalling parcelable parcel

我最近在 Android 的 Parcel 类中发现了一个非常愚蠢的实现(至少从我的角度来看是这样)。

假设我有一个像这样的简单类

class Foo implements Parcelable{

    private String[] bars;
    //other members

    public in describeContents(){ 
        return 0;
    }

    public void writeToParcel(Parcel dest, int flags){

        dest.writeStringArray(bars);
        //parcel others
    }

    private Foo(Parcel source){
        source.readStringArray(bars);
        //unparcel other members
    }

    public static final Parcelable.Creator<Foo> CREATOR = new Parcelable.Creator<Foo>(){

         public Foo createFromParcel(Parcel source){
             return new Foo(source);
         }

         public Foo[] newArray(int size){
             return new Foo[size];
         }

    };
}

现在,如果我想打包一个 Foo 对象并且 bars 为空,我看不出有什么办法可以从这种情况中恢复(当然除了捕获异常)。下面是 Parcel 中这两个方法的实现:

 public final void writeStringArray(String[] val) {
        if (val != null) {
            int N = val.length;
            writeInt(N);
            for (int i=0; i<N; i++) {
                writeString(val[i]);
            }
        } else {
            writeInt(-1);
        }
    }


  public final void readStringArray(String[] val) {
        int N = readInt();
        if (N == val.length) {
            for (int i=0; i<N; i++) {
                val[i] = readString();
            }
        } else {
            throw new RuntimeException("bad array lengths");
        }
    }

因此,如果我传递 null 的 bars,writeStringArray 就可以了。它只是将 -1 写入 Parcel。但是应该如何使用 readStringArray 方法呢?如果我在内部传递 bars(当然是 null),我将从 val.length 得到一个 NullPointerException。如果我在像说 bars = new String[???] 之前创建 bars 我不知道它应该有多大。如果大小与里面写的不匹配,我会收到 RuntimeException。

为什么 readStringArray 不知道从 writeStringArray 写入空对象并返回的 -1 结果?

我看到的唯一方法是在调用 writeStringArray(String[]) 之前保存 bars 的大小,这使得该方法有点无用。它还会冗余地保存数组的大小两次(一次我记得,第二次来自 writeStringArray)。

有谁知道应该如何使用这两种方法,因为上面没有针对它们的 java 文档?

最佳答案

你应该使用 Parcel.createStringArray()在你的情况下。

我无法想象 Parcel.readStringArray(String[] val) 的合适用例但为了使用它,您必须知道数组的确切大小并手动分配它。

关于java - 如何在 Parcel 中使用 writeStringArray() 和 readStringArray(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14385253/

相关文章:

java - Seam拦截器抽象基类

java - ArrayList retainAll 让我困惑

c# - .Net c# char * 编码

java - Grails XML 编码 : change default "<list>" root element name

java - 编码错误 : javax. xml.bind.JAXBException:此上下文已知类或其任何父类(super class)

java - WebLogic 中的 Xerces ClassCastException

java - 不在 Java 中绘制图形

java - 在我的项目列表中添加删除按钮

Android 11 ACTION_OPEN_DOCUMENT_TREE : set initial URI to the Documents folder

android - 如何在设备启动时使用 AlarmManager 启动警报?