Означает ли oneway объявление в 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 соответствующим образом, чтобы вызов из нового потока блокировался до первого вызова.

Если все работает так, как я думаю, то, объявив интерфейс oneway как oneway , я гарантирую, что это так. По крайней мере, я не могу придумать, каким образом вызов из IServer.doSomething() в IClient.reportBack() может немедленно возвратиться (что необходимо сделать в oneway ), но IClient.reportBack все еще сможет повторно IServer.doSomething Рекурсивно в том же потоке. Должен быть запущен либо новый поток в IServer, либо старый поток IServer может быть повторно использован для внутреннего вызова IServer.doSomething (), но только после того, как внешний вызов IServer.doSomething() вернулся.

Итак, мой вопрос: все работает так, как я думаю? Документация Android вряд ли упоминает интерфейсы oneway .

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