[英]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文件引用自定義對象,如下所示。
package myservice;
parcelable myservice.MyItem;
package myservice;
import myservice.IMyItem;
interface IAsyncService
{
void addItems(in List<MyItem> itemCollection);
}
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.