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

前端之家收集整理的这篇文章主要介绍了java – Android .aidl中的单向声明是否保证在单独的线程中调用该方法?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_403_1@我正在为 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 );
  .
  .
  .
}

IClient.aidl:

package com.my.application;

oneway interface IClient {

    /**
     * Receive an answer
     */
    void reportBack( in String answer );
  .
  .
  .
}

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

这里的问题是IServer.doSomething()通常不会是可重入的.只要IClient.reportBack()始终在新线程中调用,这没关系.在这种情况下,我可以确保IServer.doSomething()的实现始终适当地同步,以便来自新线程的调用阻塞直到第一次调用返回.

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

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

解决方法

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

猜你在找的Android相关文章