web-dev-qa-db-ja.com

AIDLインターフェースパラメータ値の「in / out / inout」?

ラジオストリーミングアプリをプログラミングしています。 AIDLインターフェース技術を使用してサービスと通信することにより、リモートサービスとして「ラジオ再生」を実行します。しかし、私は1つのことを本当に理解していません。

AIDLインターフェイスパラメータ値の「アウト」とは何ですか?

このような:

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

メソッドがアクティビティから呼び出されたときにリモートにデータを送信する「in」を理解しています。

「out」とは何ですか。同じ方法で「in」と「out」が必要なのはなぜですか。それら( "out/inout")はどちらの場合に使用されますか?なぜString[] "でる"?

助けてください..

36

[〜#〜] aidl [〜#〜] では、outタグは出力専用パラメーターを指定します。つまり、これは入力に関する興味深いデータを含まないパラメーターですが、メソッド中にデータで埋められます。

たとえば、バイトの配列をコピーするメソッドは、次のように指定できます。

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

inoutタグは、パラメーターが入力と出力の両方で意味を持つことを示します。例えば:

void charsToUpper(inout char[] chars);

すべてのパラメーターの内容は マーシャリング (シリアライズ、送信、受信、およびデシリアライズ)でなければならないため、これは重要です。 in/outタグを使用すると、バインダーはマーシャリング手順をスキップしてパフォーマンスを向上させることができます。

51
gladed

いきます

  • データがどちらの方向に進むかを示す唯一の方向タグ。
    • 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);
}

ここでは、outininout方向タグを使用して、データがどちらの方向に進むかを示しています。

  1. getTeamCaptian(out TeamMember member):チームのキャプテンを取得します。ここで、「out」方向タグは、クライアントがこのメソッドを呼び出すと、「メンバー」オブジェクトに関連データがないことを意味しますが、サーバーは「メンバー」オブジェクトに変更を加えるため、クライアントは更新された「メンバー」オブジェクトを取得します。実際、メソッド呼び出しは同期です。

  2. pdateTeamMember(inout TeamMember member、in boolean isLeader):チームのキャプティアンを更新します。ここで、「inout」方向タグは、クライアントがこのメソッドを呼び出すと、「メンバー」オブジェクトに関連データが含まれることを意味します。そして、サーバーは入力データを使用して処理する必要があります。プロセスが完了すると、クライアントは関連データを取得します。実際、メソッド呼び出しはsynchronousです。

  3. removeTeamMember(in TeamMember member)チームからメンバーを削除します。ここで、「in」方向タグは、「メンバー」オブジェクトがクライアントからサービスに転送され、入力にのみ使用されることを意味します。サービスの「メンバー」オブジェクトに変更が加えられた場合、クライアントには反映されません。メソッド呼び出しは非同期です。メソッドシグネチャに "oneway"キーワードを付けることができます。非同期メソッドには「out」および「inout」引数を含めることはできません。また、voidを返す必要があります。

6
Hardian