0

我做了一个调用远程服务的简单测试(在不同的进程上),我发现了一些非常令人惊讶的事情。

假设我们有两个进程: Process-A 与 Thread-AProcess-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

4

1 回答 1

0

找到了答案。

任何调用 Remote 方法的线程都在等待,直到远程进程中的方法完成。为了使调用异步 - 我们需要将 AIDL 定义为 oneway。例如:单向接口 IRemoteServiceOnewayAIDL {

于 2013-01-20T16:09:54.817 回答