【发布时间】:2010-06-14 23:45:25
【问题描述】:
我正在为 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 接口。
【问题讨论】:
标签: java android multithreading aidl