【问题标题】:Complex Object in aidl file having nested parceable具有嵌套parcelable的aidl文件中的复杂对象
【发布时间】:2014-05-20 07:48:24
【问题描述】:

我已经为 IPC 开发了一个演示并使用有界服务来处理它....但是在使用复杂的数据结构(即 parceable 内 parceable)时遇到了一些问题。
我有这样的数据结构......

ObjectX.java

 public class ObjectX implements Parcelable {

    private Integer code;
    private OtherEntity entity;

    public ObjectX(Integer _code, OtherEntity _entity) {

        code = _code;
        entity = _entity;
    }

    public ObjectX(Parcel source) {
        readfromParcel(source);
    }

    private void readfromParcel(Parcel source) {

        code = source.readInt();
        entity = (OtherEntity) source.readParcelable(OtherEntity.class
                .getClassLoader());
    }

    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(code);
        dest.writeParcelable(entity, flags);
    }

    public static final Parcelable.Creator<ObjectX> CREATOR = new Parcelable.Creator<ObjectX>() {
        @Override
        public ObjectX[] newArray(int size) {
            return new ObjectX[size];
        }

        @Override
        public ObjectX createFromParcel(Parcel source) {
            return new ObjectX(source);
        }
    };
}

OtherEntity.java

  public class OtherEntity implements Parcelable {
    private Integer m_code;

    public OtherEntity(Parcel source) {
        m_code = source.readInt();

    }

    public OtherEntity(Integer code) {
        m_code = code;

    }

    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(m_code);
    }

    public static final Parcelable.Creator<OtherEntity> CREATOR = new Parcelable.Creator<OtherEntity>() {
        @Override
        public OtherEntity[] newArray(int size) {
            return new OtherEntity[size];
        }

        @Override
        public OtherEntity createFromParcel(Parcel source) {
            return new OtherEntity(source);
        }
    };
}

我已经在这两个类中实现了 Parcelable..

我的aidl文件是:

ObjectX.aidl:

package com.example.demo.A;
parcelable ObjectX;

IMyService.aidl:

package com.example.demo.A;
import com.example.demo.A.ObjectX ;

interface IMyService {
    void setOrderData(in ObjectX data);
}

现在在对象列表中设置数据时:

orderData.add(order);

传递为

mService.setOrderData(new Object(1,new OtherEntity(1));

我遇到了这个异常:

05-20 15:35:28.018: E/AndroidRuntime(818): FATAL EXCEPTION: main
05-20 15:35:28.018: E/AndroidRuntime(818): java.lang.NullPointerException: expected receiver of type com.example.remoteservice.OtherEntity, but got null
05-20 15:35:28.018: E/AndroidRuntime(818):  at java.lang.reflect.Field.getField(Native Method)
05-20 15:35:28.018: E/AndroidRuntime(818):  at java.lang.reflect.Field.get(Field.java:269)
05-20 15:35:28.018: E/AndroidRuntime(818):  at android.os.Parcel.readParcelable(Parcel.java:1955)
05-20 15:35:28.018: E/AndroidRuntime(818):  at com.example.remoteservice.ObjectX.readfromParcel(ObjectX.java:58)
05-20 15:35:28.018: E/AndroidRuntime(818):  at com.example.remoteservice.ObjectX.<init>(ObjectX.java:49)
05-20 15:35:28.018: E/AndroidRuntime(818):  at com.example.remoteservice.ObjectX$1.createFromParcel(ObjectX.java:94)
05-20 15:35:28.018: E/AndroidRuntime(818):  at com.example.remoteservice.ObjectX$1.createFromParcel(ObjectX.java:1)
05-20 15:35:28.018: E/AndroidRuntime(818):  at android.os.Parcel.createTypedArrayList(Parcel.java:1616)
05-20 15:35:28.018: E/AndroidRuntime(818):  at com.example.remoteservice.IRemote$Stub$Proxy.getOrderData(IRemote.java:247)
05-20 15:35:28.018: E/AndroidRuntime(818):  at com.example.consumerapp3.RemoteServiceClient.onClick(RemoteServiceClient.java:95)
05-20 15:35:28.018: E/AndroidRuntime(818):  at android.view.View.performClick(View.java:3480)
05-20 15:35:28.018: E/AndroidRuntime(818):  at android.view.View$PerformClick.run(View.java:13983)
05-20 15:35:28.018: E/AndroidRuntime(818):  at android.os.Handler.handleCallback(Handler.java:605)
05-20 15:35:28.018: E/AndroidRuntime(818):  at android.os.Handler.dispatchMessage(Handler.java:92)
05-20 15:35:28.018: E/AndroidRuntime(818):  at android.os.Looper.loop(Looper.java:137)
05-20 15:35:28.018: E/AndroidRuntime(818):  at android.app.ActivityThread.main(ActivityThread.java:4340)
05-20 15:35:28.018: E/AndroidRuntime(818):  at java.lang.reflect.Method.invokeNative(Native Method)
05-20 15:35:28.018: E/AndroidRuntime(818):  at java.lang.reflect.Method.invoke(Method.java:511)
05-20 15:35:28.018: E/AndroidRuntime(818):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-20 15:35:28.018: E/AndroidRuntime(818):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-20 15:35:28.018: E/AndroidRuntime(818):  at dalvik.system.NativeStart.main(Native Method)

谁能告诉我我错过了什么???

【问题讨论】:

  • 发布OtherEntity班级代码
  • @pskink 检查已编辑的问题....
  • 这就是你所有的堆栈跟踪吗?
  • 检查新的堆栈跟踪...

标签: android parcelable aidl


【解决方案1】:

我猜你的构造函数public Object(Parcel source) 得到一个空值作为源。

【讨论】:

  • yeha 仅在entity = (OtherEntity) source.readParcelable(OtherEntity.class.getClassLoader()); 出现错误。但请注意看包裹:(
【解决方案2】:

您的代码运行良好,我假设:

  1. 您调用 AIDL 方法的代码:

    mService.setOrderData(new Object(1,new OtherEntity(1));
    

意思是:

    mService.setOrderData(new ObjectX(1, new OtherEntity(1)));
  1. OtherEntity 的 AIDL 文件已创建。

OtherEntity.aidl

package com.example.demo.A;
parcelable OtherEntity;

休息一切正常。希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 2019-07-06
    • 2012-10-08
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多