Одностороннее объявление в 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 );
  .
  .
  .
}

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 интерфейсы.

7
задан Dan Menes 14 June 2010 в 23:45
поделиться

1 ответ

Ключевое слово oneway означает, что если этот вызов приводит к IPC (т.е. вызывающий и вызываемый находятся в разных процессах), то вызывающий процесс не будет ждать, пока вызываемый процесс обработает IPC. Если это не приведет к IPC (т.е. они оба находятся в одном процессе), вызов будет синхронным. Это досадная деталь, которая сильно упрощает реализацию Binder IPC. Если они находятся в одном процессе, вызов является обычным вызовом метода Java.

18
ответ дан 6 December 2019 в 10:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: