我做了一个调用远程服务的简单测试(在不同的进程上),我发现了一些非常令人惊讶的事情。
假设我们有两个过程: 使用Thread-A的进程A 和 过程-B
如果进程A运行,则Thread-A和Thread-A使用IPC-AIDL调用远程void方法。 会发生什么是: 进程B将使用其中一个Binder线程运行调用的方法。 在此期间,Process-A中的Thread-A将等待。 只有在Process-B中的Binder线程完成方法调用后,才会通知线程A并恢复其工作。
我的问题: 这是标准行为吗? 如果是这样,为什么会那样? Thread-A如果是void方法则不应该等待。 (“单向”与之相关吗?)
我的代码:
在流程A中:
Log.d("Text", "Lior: Client: Thread: " + Thread.currentThread().getName() + " Passing parcelableClass: parcelableClass.hashCode: " + parcelableClass.hashCode());
for(int i = 0; i < 1; i++) {
_iRemoteServiceBinder.passObject(parcelableClass);
}
Log.d("Text", "Lior: Client: Thread: " + Thread.currentThread().getName() + " Passed parcelableClass: parcelableClass.hashCode: " + parcelableClass.hashCode());
在流程B中:
private final IRemoteServicePassObject.Stub _binder = new IRemoteServicePassObject.Stub() {
@Override
public void passObject(ParcelableClass parcelableClass)
throws RemoteException {
Log.d("Text", "Lior: Service: got pacelableClass: a: " + parcelableClass.getA() +
" b: " + parcelableClass.getB() +
" s: " + parcelableClass.getS() + " hashCode: " + parcelableClass.hashCode()
+ " Running thread: " + Thread.currentThread().getName());
try {
Thread.currentThread().sleep(5000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Log.d("Text", "Lior: Service: Finished: "
+ " Running thread: " + Thread.currentThread().getName());
我得到的结果:
01-15 19:52:03.292:D / Text(22792):Lior:客户:线程:主要传递 parcelableClass:parcelableClass.hashCode:1096225792 01-15 19:52:03.297:D / Text(23014):Lior:服务:得到起搏类:a:1 b:2 s:String hashCode:1096136272正在运行的线程:Binder线程#2 01-15 19:52:08.302:D / Text(23014):Lior:服务:完成:跑步 thread:Binder Thread#2 01-15 19:52:08.312:D / Text(23014):Lior: 服务:运行新线程:LiorThread 01-15 19:52:10.342: D / Text(22792):Lior:Client:Thread:main Passed parcelableClass: parcelableClass.hashCode:1096225792
答案 0 :(得分:0)
找到答案。
任何调用Remote方法的线程都在等待,直到该方法在远程进程中完成。 为了使调用异步 - 我们需要将AIDL定义为单向。 例如: 单向接口IRemoteServiceOnewayAIDL {