当前位置: 首页 > 面试题库 >

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

拓拔飞飙
2023-03-14
问题内容

我正在为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()总是synchronized适当的,以便从新线程进行的调用一直阻塞到第一个调用返回为止。

如果一切都按我认为的方式工作,那么通过将IClient接口声明为oneway,我保证情况确实如此。至少,我想不出什么办法,从呼叫IServer.doSomething()IClient.reportBack()可以立即返回(什么oneway是应该保证),但IClient.reportBack仍然能够重新调用IServer.doSomething在同一个线程递归。必须启动IServer中的新线程,或者可以将旧的IServer线程重新用于IServer.doSomething()的内部调用,但前提是IServer.doSomething()必须返回外部调用。

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


问题答案:

oneway关键字表示,如果该呼叫导致IPC(即,呼叫者和被呼叫者位于不同的进程中),则呼叫进程将不等待被呼叫进程处理IPC。如果未生成IPC(即它们都在同一进程中),则该调用将是同步的。这是一个不幸的细节,大大简化了活页夹IPC的实现。如果它们处于同一进程中,则该调用只是常规的Java方法调用。



 类似资料:
  • 问题内容: 众所周知,JavaScript在所有现代浏览器实现中都是单线程的,但是它是在任何标准中指定的,还是仅根据传统?假设JavaScript始终是单线程的,是否完全安全? 问题答案: 这是个好问题。我很想说“是”。我不能 通常认为JavaScript具有脚本(*)可见的单个执行线程,因此,当您输入内联脚本,事件侦听器或超时时,您将完全处于控制状态,直到从块或函数的结尾返回为止。 (*:忽略浏

  • 问题内容: 我是Java新手,我想知道我是否具有以下典型的Java代码 JVM是否保证将始终运行finally块?为了了解我的来历,我已经习惯了C / C ++程序,如果您取消引用NULL指针,并且之后没有任何代码可以运行,它们可能会崩溃。 但是,据我了解Java和整个GC /托管内存业务的一般情况,没有诸如空指针取消引用之类的东西,所有这些都是可捕获的期望,因此,我的程序实际上没有崩溃的方法可能

  • 问题内容: 我的程序使用Java Scripting API,并且可以同时评估某些脚本。他们不使用共享脚本对象,绑定或上下文,但可以使用和对象。我看到,在Java的甲骨文8实施犀牛不是多线程的,回报率约该文件说: 引擎实现不是线程安全的,并且不能用于在多个线程上同时执行脚本。 这是否意味着我应该为每个线程创建一个单独的实例?此外,文档没有说明并发使用,而是: 每个CompiledScript与一个

  • 当我调用foo()时,这个方法是否在单独的线程上运行?

  • 问题内容: 是否可以在Gradle中声明一个可在Java中使用的变量?基本上,我想在build.gradle中声明一些var,然后在构建时(显然)获取它。就像C / C ++中的预处理器宏一样… 一个声明的例子就是这样: 有没有办法做这样的事情? 问题答案: 生成Java常量 你可以使用 产生Android资源 你可以使用或以通常的方式访问它们

  • 我想在使用RXJava的非主线程中调用“onSensorChanged”方法。 这是我的传感器代码。