aidl文件修改完成后,需要Rebuild Project,而不是Clean Project 。
Clean Project 仅仅会删除项目下Build文件夹,而不会生成aidl文件所对应的Java文件,但Rebuild Project会生成java文件(Rebuild Project命令包含Clean Project命令
)。
需要注意的是:
直接选择Android Studio的 Build -- Rebuild Project会Rebuild
所有的项目,耗时较长。
应该选择右侧的Gradle窗口 -- module name -- Tasks -- build -- build 会更快。
aidl中定义的方法不能同名
代码
// MistakeNoteStateListener.aidl
package com.noahedu.mistakequestion.service;
import com.noahedu.mistakequestion.service.MistakeNoteBean;
// Declare any non-default types here with import statements
interface MistakeNoteStateListener {
void onSuccess();
void onSuccess(in MistakeNoteBean bean, int successType, String successMsg);
void onFail(in MistakeNoteBean bean, int errorType, String errorMsg);
}
这样的代码会报错:
Execution failed for task ':noah_mistakequestion:compileDebugAidl'.
> java.io.IOException: com.android.ide.common.process.ProcessException: Error while executing process D:\AndroidSetup\sdk\build-
tools\27.0.3\aidl.exe with arguments {-pD:\AndroidSetup\sdk\platforms\android-28\framework.aidl -
oD:\workspace_eclipse_formal\All_P712\apps\MistakeNoteP712\noah_mistakequestion\build\generated\source\aidl\debug -
ID:\workspace_eclipse_formal\All_P712\apps\MistakeNoteP712\noah_mistakequestion\src\debug\aidl -
ID:\workspace_eclipse_formal\All_P712\apps\MistakeNoteP712\noah_mistakequestion\src -
ID:\workspace_eclipse_formal\All_P712\apps\MistakeNoteP712\base_lib\build\intermediates\packaged-aidl\debug -
ID:\workspace_eclipse_formal\All_P712\apps\MistakeNoteP712\base_pro_aicommon\build\intermediates\packaged-aidl\debug -
ID:\workspace_eclipse_formal\All_P712\apps\MistakeNoteP712\base_pro_camfinger\build\intermediates\packaged-aidl\debug -
ID:\workspace_eclipse_formal\All_P712\apps\MistakeNoteP712\base_lib_mycamera\build\intermediates\packaged-aidl\debug -
dC:\Users\shaoqw\AppData\Local\Temp\aidl7732171557994486593.d
D:\workspace_eclipse_formal\All_P712\apps\MistakeNoteP712\noah_mistakequestion\src\com\noahedu\mistakequestion\service\MistakeNoteStateListener.aidl}
网上有人说,是要用的类没有导包,实体类与管理类包名不一致导致的,
但是我这里是因为 方法名相同导致的,有两个onSuccess
方法,改成onSuccess2
就好了
interface MistakeNoteStateListener {
void onSuccess();
void onSuccess2(in MistakeNoteBean bean, int successType, String successMsg);
void onFail(in MistakeNoteBean bean, int errorType, String errorMsg);
}
编写AIDL文件没有提示
目前没发现什么解决方法。
AndroidStudio和Eclipse存放AIDL目录不一样的问题
androidstudio 存放moduleName/src/main/aidl
eclipse 存放在 projectName/src
如果项目是eclipse结构需要在android下添加 aidl.srcDirs = ['src']
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
}
一定要对异常做处理
try {
mistakeNoteManager.removeMistakeNoteByListener(mMistakeNoteBean, mMistakeNoteStateListener);
} catch (RemoteException e) {
e.printStackTrace();
//处理异常
handleException();
}
一定要对异常做处理,比如消失弹框,状态重置,弹出提醒等
不做处理很难发现错误所在,因为可能是服务端出错引起的异常。
复杂对象要放后面
复杂对象(需要in、out、inout的对象)要放后面,不然传到服务端可能会为空。
这种问题原因很难说,出现这种问题,先看看对象是不是真的传的是空,如果不是,就看看复杂对象是不是放前面了。
如下可能会发生为空的错误:
interface BookManager {
boolean addBook(in Book book, int index);
}
需改为 int在前,Book在后
:
interface BookManager {
boolean addBook(int index, in Book book) ;
}
复杂对象有out inout修饰时,需要实现readFromParcel(Parcel in)
方法
不然会报错,out inout 会同步服务端修改的对象的数据,需要调用readFromParcel(Parcel in)
方法
参考文章:AIDL Parcelable readFromParcel(Parcel) out inout相关错误
参考文章:
Android AIDL使用详解
带你一起剖析Android AIDL跨进程通信的实现原理
AIDL自定义类型的错误 java.io.IOException: com.android.ide.common.process.ProcessException
网友评论