导航号,我的单页导航
文章目录

前言

记录一下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之注册和解注册监听器

© 版权声明
导航号,我的单页导航

暂无评论

暂无评论...