«In / out / inout» в значении параметра интерфейса AIDL? - PullRequest
34 голосов
/ 15 января 2011

Я программирую приложение для потокового радио. Я запускаю «воспроизведение радио» как удаленный Сервис, используя технику интерфейса AIDL для связи с Сервисом. Но я не совсем понимаю одну вещь.

Что такое "out" в значении параметра интерфейса AIDL?

Как это:

String doSomething(in String a, out String[] b);

Я понимаю, что "in" означает отправку данных на удаленный компьютер, когда метод вызывается из действия.

Что такое «снаружи» и почему нам нужно «входить» и «выходить» одним и тем же способом? В каком случае они (out / inout) используются? Почему String[] "вне"?

Пожалуйста, помогите ..

Ответы [ 2 ]

50 голосов
/ 24 марта 2011

В AIDL , тег out указывает параметр только для вывода. Другими словами, это параметр, который не содержит интересных данных на входе, но будет заполнен данными во время метода.

Например, метод, который копирует массив байтов, может быть указан следующим образом:

void copyArray(in byte[] source, out byte[] dest);

Тег inout указывает, что параметр имеет значение как на входе, так и на выходе. Например:

void charsToUpper(inout char[] chars);

Это важно, потому что содержимое каждого параметра должно быть маршализовано (сериализовано, передано, получено и десериализовано). Теги in / out позволяют Binder пропустить этап сортировки для повышения производительности.

4 голосов
/ 31 января 2019

Вот так,

  • Это всего лишь тег направления, указывающий, в каком направлении идут данные.
    • in - объект передается от клиента к услуге, используемой только для входных данных
    • out - объект передается от клиента к услуге, используемой только для выходных данных,
    • inout - объект передается от клиента к сервису, используемому как для входов, так и для выходов.
  • Все не примитивные параметры требуютНаправленный тег, указывающий, в какую сторону идут данные.Вход, выход или выход.

  • Примитивы in по умолчанию и не могут быть иначе

  • Обратите внимание, вызовы RPCиз клиентов синхронные .
  • Вы должны ограничить направление тем, что действительно необходимо, потому что маршалинг параметров дорог.

Пример : пожалуйста, проверьте нижеИнтерфейс AIDL для лучшего понимания.

package com.hardian.sample.aidl;
import com.hardian.sample.aidl.TeamMember;

interface ITeamManageService {
void getTeamCaptian(out TeamMember member);
void updateTeamMember(inout TeamMember member, in boolean isLeader);
oneway void removeTeamMember(in TeamMember member);
}

Здесь мы использовали out , in , inout направленные теги для указанияв какую сторону идут данные.

  1. getTeamCaptian (из члена TeamMember) : получить капитана команды.Здесь тег направления " out " означает, что когда клиент вызывает этот метод, объект "member" не имеет соответствующих данных, но сервер должен внести изменения в объект "member", поэтому клиент должен получитьобновленный объект "член".На самом деле, вызов метода синхронный .

  2. updateTeamMember (inout член TeamMember, в логическом isLeader) : обновить капитан команды,Здесь тег направления " inout " означает, что когда клиент вызывает этот метод, объект "member" содержит соответствующие данные.И сервер должен использовать входные данные и обрабатывать их.После завершения процесса клиент должен получить соответствующие данные обратно.На самом деле, вызов метода: синхронный .

  3. removeTeamMember (в члене TeamMember) Удалить участника из команды.Здесь тег направления " in " означает, что объект "member" передается от клиента к услуге, используемой только для входных данных.Если какие-либо изменения будут внесены в объект "member" в сервисе, это не будет отражено в клиенте.Вызов метода асинхронный , мы можем поставить ключевое слово " oneway " в сигнатуру метода.Асинхронные методы не должны иметь аргументов "out" и "inout", они также должны возвращать void.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...