Android .aidl中的单向声明是否保证在单独的线程中调用该方法?

Dan*_*nes 7 java multithreading android aidl

我正在为Android手机的客户端/服务器应用程序设计框架.我对Java和Android都很陌生(但对于一般的编程或特别是线程编程来说并不陌生).

有时我的服务器和客户端将处于相同的进程中,有时它们将处于不同的进程中,具体取决于具体的用例.客户端和服务器接口类似于以下内容:

IServer.aidl:

package com.my.application;

interface IServer {

    /**
     * Register client callback object
     */
    void registerCallback( in IClient callbackObject );

    /**
     * Do something and report back
     */
    void doSomething( in String what );
  .
  .
  .
}
Run Code Online (Sandbox Code Playgroud)

IClient.aidl:

package com.my.application;

oneway interface IClient {

    /**
     * Receive an answer
     */
    void reportBack( in String answer );
  .
  .
  .
}
Run Code Online (Sandbox Code Playgroud)

现在这里有趣的地方.我可以预见客户端呼叫的用例,IServer.doSomething()然后呼叫IClient.reportBack(),并根据报告的内容,IClient.reportBack()需要发出另一个呼叫IClient.doSomething().

这里的问题是,IServer.doSomething()通常不会是可重入的.没关系,只要IClient.reportBack()总是在新线程中调用.在这种情况下,我可以确保执行IServer.doSomething()始终是synchronized适当的,以便从新线程的调用阻塞,直到第一个调用返回.

如果一切按照我认为的方式工作,那么通过声明IClient接口oneway,我保证就是这种情况.至少,我无法想到来自IServer.doSomething()to 的调用IClient.reportBack()可以立即返回(oneway应该确保什么),但IClient.reportBack仍然能够IServer.doSomething在同一个线程中递归地重新调用.必须启动IServer中的新线程,否则旧的IServer线程可以重新用于对IServer.doSomething()的内部调用,但只有在外部调用IServer.doSomething()返回后才能使用.

所以我的问题是,一切都按我认为的方式运作吗?Android文档几乎没有提到oneway接口.

joe*_*oeo 18

oneway关键字意味着如果该调用导致IPC(即调用者和被调用者处于不同的进程中),则调用进程将不等待被调用进程处理IPC.如果它不会导致IPC(即它们都在同一个进程中),则呼叫将是同步的.这是一个令人遗憾的细节,它简化了绑定器IPC的实现.如果它们在同一个进程中,则调用只是一个常规的java方法调用.

  • 我已经构建了一个测试应用程序并确认您是正确的.当从不同的进程调用时,行为就像记录的那样 - 单向接口中对方法的调用是异步的 - 但是当从同一进程调用时,调用是同步的. (3认同)