调用Remote服务的线程等待方法完成?

时间:2013-01-15 17:53:15

标签: java android service remote-access remoteobject

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

假设我们有两个过程: 使用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

1 个答案:

答案 0 :(得分:0)

找到答案。

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