前言
记录一下AIDL中常见的问题,方便自己回忆和学习。
正文
package com.biumall.binderlibmedia.bean; import android.os.Parcel; import android.os.Parcelable; public class BookBean implements Parcelable{ private String name; private String author; private double price; private int page; //略 protected BookBean(Parcel in) { //PS: 读值顺序和writeToParcel()方法中一致的 name = in.readString(); author = in.readString(); price = in.readDouble(); page = in.readInt(); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeString(author); dest.writeDouble(price); dest.writeInt(page); } public static final Creator<BookBean> CREATOR = new Creator<BookBean>() { @Override public BookBean createFromParcel(Parcel in) { return new BookBean(in); } @Override public BookBean[] newArray(int size) { return new BookBean[size]; } }; }
无法解析BookBean
Failed to resolve 'BookBean'
原因
BookBean不是AIDL支持豁免的类型,这个是我们定义的封装类,需要手动导入对应的包名。
AIDL支持int,short,boolean等基本类型,以及String,CharSequence和List自动导入包名,但其他的都需要手动导入。
比如上面的BookBean活ArrayList等需要手动导入。
解决方法
导入BookBean的包名
import com.biumall.binderlibmedia.bean.BookBean;
无法找到BookBean类
couldn't find import for class com.biumall.binderlibmedia.bean
原因
aidl这个语言的规范就是aidl文件,需要把BookBean转为aidl文件给其他aidl调用。
解决方法
在aidl目录下,创建BookBean一样的包名目录
com.biumall.binderlibmedia.bean
在创建的目录下,创建aidl文件,改名字为BookBean.aidl,写入如下内容
package com.biumall.binderlibmedia.bean; parcelable BookBean;
PS : parcelable是小写
can be an out type
parameter bean (argument 1): 'com.biumall.binderlibmedia.bean.BookBean' can be an out type, so you must declare it as in, out, or inout.
原因
有些类型缺少in\out\inout标签就会报错。
in 表示数据只能由客户端流向服务端; out 表示数据只能由服务端流向客户端;inout 表示数据可在服务端和客户端双向流通。
解决方法
我这异常提示是如下两个方法
void addBook(BookBean bean); boolean removeBook(BookBean bean);
添加一个in标签,如下
void addBook(in BookBean bean); boolean removeBook(in BookBean bean);
参考文章
《》
《》
《》
© 版权声明