Я разрабатываю платформу для клиент-серверного приложения для телефонов на базе 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 (т.е. они оба находятся в одном процессе), вызов будет синхронным. Это досадная деталь, которая сильно упрощает реализацию Binder IPC. Если они находятся в одном процессе, вызов является обычным вызовом метода Java.