我有一个可打包的对象,用于将其从活动传递到远程服务。当我使用aidl接口传递它时,一切听起来都很好。
最近,我试图通过信使从活动。

// TEST TEST TEST!
StockInfo stockInfo0 = new StockInfo(Code.newInstance("code0"), Symbol.newInstance("symbol0"));
StockInfo stockInfo1 = new StockInfo(Code.newInstance("code1"), Symbol.newInstance("symbol1"));
StockInfo stockInfo2 = new StockInfo(Code.newInstance("code2"), Symbol.newInstance("symbol2"));
List<StockInfo> stockInfos = new ArrayList<StockInfo>();
stockInfos.add(stockInfo0);
stockInfos.add(stockInfo1);
stockInfos.add(stockInfo2);
StockInfosEx stockInfosEx = new StockInfosEx(stockInfos, "abc");
msg.obj = stockInfosEx;

try {
    mService.send(msg);
} catch (RemoteException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

我在远程服务中遇到以下异常。
02-21 22:55:16.546:E/包裹(8365):当
解组:com.example.testonmessenger.stockinfosex,E:
java.lang.ClassNotFoundException异常:
com.example.testonmessenger.stockinfosex网站
我在想,这两者之间会有什么问题?这是我的包裹。
public class StockInfosEx implements Parcelable {
    public final List<StockInfo> stockInfos;
    public final String searchedString;

    public StockInfosEx(List<StockInfo> stockInfos, String searchedString) {
        this.stockInfos = stockInfos;
        this.searchedString = searchedString;
    }

    ////////////////////////////////////////////////////////////////////////////
    // Handling Parcelable nicely.

    public static final Parcelable.Creator<StockInfosEx> CREATOR = new Parcelable.Creator<StockInfosEx>() {
        public StockInfosEx createFromParcel(Parcel in) {
            return new StockInfosEx(in);
        }

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

    private StockInfosEx(Parcel in) {
        stockInfos = new ArrayList<StockInfo>();
        in.readTypedList(stockInfos, StockInfo.CREATOR);
        searchedString = in.readString();
    }

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

    @Override
    public void writeToParcel(Parcel parcel, int flags) {
        parcel.writeTypedList(stockInfos);
        parcel.writeString(searchedString);
    }

    // Handling Parcelable nicely.
    ////////////////////////////////////////////////////////////////////////////
}

要获得完整的源代码,请从https://www.dropbox.com/s/n69yuhddpb8vedz/testonmessenger.zip

最佳答案

不可行的方法(因为我们的parcelable是自定义的,而不是像rect这样的框架的一部分)
活动

msg.obj = stockInfosEx;

远程服务
StockInfosEx stockInfosEx = (StockInfosEx)msg.obj;

可行的方法
活动
msg.getData().putParcelable("data", stockInfosEx);

远程服务
msg.getData().setClassLoader(StockInfosEx.class.getClassLoader());
StockInfosEx stockInfosEx = (StockInfosEx)msg.getData().getParcelable("data");

现在,在我再次阅读msg.obj(http://developer.android.com/reference/android/os/Message.html#obj)的文档之后,只有我理解它的真正含义Parcelable of a framework class
要发送给收件人的任意对象。使用Messenger时
跨进程发送消息只有在
包含框架类的Parcelable(不是由
应用程序)。对于其他数据传输,使用setdata(bundle)。
注意,在froyo之前,这里不支持可分块的对象。
释放。

关于android - 通过Messenger将Parcelable传递给远程服务时解码时找不到类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15005615/

10-09 20:35