我正在为 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()
toIClient.reportBack()
可以立即返回(oneway
应该确保什么),但IClient.reportBack
仍然能够IServer.doSomething
在同一个线程中递归地重新调用。要么必须启动 IServer 中的新线程,要么旧的 IServer 线程可以重新用于对 IServer.doSomething() 的内部调用,但只有在外部调用IServer.doSomething()
返回之后。
所以我的问题是,一切都按照我的想法进行吗?Android 文档几乎没有提到oneway
接口。