前言

记录一下AIDL中常见的问题,方便自己回忆和学习。

正文

这里以BookBean为例

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);

参考文章

  1. 创建AIDL的常见问题 can be an out type, so you must declare it as in, out, or inout.

  2. Android 深入浅出AIDL(一)

  3. AIDL之注册和解注册监听器

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

none
暂无评论...