我做了一个调用远程服务的简单测试(在不同的进程上),我发现了一些非常令人惊讶的事情。
假设我们有两个进程: Process-A 与 Thread-A 和 Process-B。
如果进程 A 正在运行 Thread-A 并且 Thread-A 使用 IPC - AIDL 调用远程 void 方法。将会发生的情况是:Process-B 将让其 Binder 线程之一运行调用的方法。在此期间,进程-A 中的线程-A 将等待。只有在 Process-B 中的 Binder 线程完成方法调用后,才会通知线程 A 并恢复其工作。
我的问题: 这是标准行为吗?如果是这样,为什么会这样?如果线程 A 是 void 方法,则不应等待。(“oneway”与它有关吗?)
我的代码:
在过程 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: Client: 线程: main Passing parcelableClass: parcelableClass.hashCode: 1096225792 01-15 19:52:03.297: D/Text(23014): Lior: Service :得到了paclableClass:a:1 b:2 s:String hashCode:1096136272运行线程:Binder线程#2 01-15 19:52:08.302:D / Text(23014):Lior:服务:完成:运行线程:Binder线程#2 01-15 19:52:08.312: D/Text(23014): Lior: 服务: 运行新线程: LiorThread 01-15 19:52:10.342: D/Text(22792): Lior: Client: 线程: main通过parcelableClass:parcelableClass.hashCode:1096225792