Подтвердить что ты не робот

"In/out/inout" в значении параметра интерфейса AIDL?

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

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

Вот так:

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

void charsToUpper(inout char[] chars);

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

Ответ 2

Вот и все,

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

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

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

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

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

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

Здесь мы использовали из, в, INOUT направленных тегов, чтобы указать, какой путь проходят данные.

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

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

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