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方法调用.
| 归档时间: |
|
| 查看次数: |
6221 次 |
| 最近记录: |