簡體   English   中英

Android:AIDL中的自定義對象

[英]Android: Custom Object in AIDL

我有一個應用程序通過兩個aidl實現與自定義服務交互。 運行該服務時,我遇到以下異常:

ERROR/AndroidRuntime(9435): FATAL EXCEPTION: main
ERROR/AndroidRuntime(9435): java.lang.NullPointerException
ERROR/AndroidRuntime(9435): at android.os.Parcel.readException(Parcel.java:1328)
ERROR/AndroidRuntime(9435): at android.os.Parcel.readException(Parcel.java:1276)
ERROR/AndroidRuntime(9435): at myservice.IAsyncService$Stub$Proxy.addItems(IAsyncService.java:259)

從這個錯誤來看,我認為這與進行的編組有關。 所以我檢查了兩個aidl實現; 第一個援助(使用原語)似乎工作正常(我認為因為他們不需要我指定導入/實現); 第二個(使用自定義對象)然而似乎崩潰給出上述錯誤。 我確保自定義對象正確實現了parcelable(請參閱帖子底部的實現),甚至嘗試從單獨的aidl文件引用自定義對象,如下所示。

(分開aidl文件。) - (IMyItem.aidl)

package myservice;
parcelable myservice.MyItem;

(其他aidl文件。) - (IAsyncService.aidl)

package myservice;
import myservice.IMyItem;

interface IAsyncService
{
    void addItems(in List<MyItem> itemCollection);
}

(Parcelable Implementation)(MyItem)

public class MyItem implements Parcelable
{
    private String name = "";

    public MyItem(String name)
    {
        this.name = name.trim();
    }

    public MyItem(Parcel source) {
        readFromParcel(source);
    }

    public void setItem(String name)
    {
        this.name = name;
    }

    public String getName()
    {
        return this.name;
    }

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

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

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel destination, int flags) {
        destination.writeString(this.name);
    }

    public void readFromParcel(Parcel source) {
        this.name = source.readString();
    }
}

有什么我遺失或完全被忽視的東西?

謝謝約翰

您看到的是遠程端拋出了NullPointerException,結果返回該異常,並重新拋出到您的客戶端。 在這些情況下,調試有助於找出原始異常的內容。 你可以用一招來做到這一點:

在實現接口的類中,重寫onTransact()來執行此操作:

protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) {
    try {
        super.onTransact(code, data, reply, flags);
    } catch (RuntimeException e) {
        Log.w("MyClass", "Unexpected remote exception", e);
        throw e;
    }
}

現在,當崩潰發生時,您還將在日志中看到打印的原始異常,以及發生的行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM