ラジオストリーミングアプリをプログラミングしています。 AIDLインターフェース技術を使用してサービスと通信することにより、リモートサービスとして「ラジオ再生」を実行します。しかし、私は1つのことを本当に理解していません。
AIDLインターフェイスパラメータ値の「アウト」とは何ですか?
このような:
String doSomething(in String a, out String[] b);
メソッドがアクティビティから呼び出されたときにリモートにデータを送信する「in」を理解しています。
「out」とは何ですか。同じ方法で「in」と「out」が必要なのはなぜですか。それら( "out/inout")はどちらの場合に使用されますか?なぜString[]
"でる"?
助けてください..
[〜#〜] aidl [〜#〜] では、out
タグは出力専用パラメーターを指定します。つまり、これは入力に関する興味深いデータを含まないパラメーターですが、メソッド中にデータで埋められます。
たとえば、バイトの配列をコピーするメソッドは、次のように指定できます。
void copyArray(in byte[] source, out byte[] dest);
inout
タグは、パラメーターが入力と出力の両方で意味を持つことを示します。例えば:
void charsToUpper(inout char[] chars);
すべてのパラメーターの内容は マーシャリング (シリアライズ、送信、受信、およびデシリアライズ)でなければならないため、これは重要です。 in/outタグを使用すると、バインダーはマーシャリング手順をスキップしてパフォーマンスを向上させることができます。
いきます
すべての非プリミティブパラメータには、データの方向を示す方向タグが必要です。イン、アウト、またはインアウトのいずれか。
プリミティブはデフォルトでinであり、それ以外の場合はできません
例:以下の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方向タグを使用して、データがどちらの方向に進むかを示しています。
getTeamCaptian(out TeamMember member):チームのキャプテンを取得します。ここで、「out」方向タグは、クライアントがこのメソッドを呼び出すと、「メンバー」オブジェクトに関連データがないことを意味しますが、サーバーは「メンバー」オブジェクトに変更を加えるため、クライアントは更新された「メンバー」オブジェクトを取得します。実際、メソッド呼び出しは同期です。
pdateTeamMember(inout TeamMember member、in boolean isLeader):チームのキャプティアンを更新します。ここで、「inout」方向タグは、クライアントがこのメソッドを呼び出すと、「メンバー」オブジェクトに関連データが含まれることを意味します。そして、サーバーは入力データを使用して処理する必要があります。プロセスが完了すると、クライアントは関連データを取得します。実際、メソッド呼び出しはsynchronousです。
removeTeamMember(in TeamMember member)チームからメンバーを削除します。ここで、「in」方向タグは、「メンバー」オブジェクトがクライアントからサービスに転送され、入力にのみ使用されることを意味します。サービスの「メンバー」オブジェクトに変更が加えられた場合、クライアントには反映されません。メソッド呼び出しは非同期です。メソッドシグネチャに "oneway"キーワードを付けることができます。非同期メソッドには「out」および「inout」引数を含めることはできません。また、voidを返す必要があります。