0

(別のプロセスで) リモート サービスを呼び出す簡単なテストを行ったところ、非常に驚​​くべきことがわかりました。

Process-A と Thread-A および Process-Bの2 つのプロセスがあると します。

プロセス A が実行中の場合、Thread-A と Thread-A は IPC - AIDL を使用してリモート void メソッドを呼び出します。プロセス B は、そのバインダー スレッドの 1 つに呼び出されたメソッドを実行させます。この間、プロセス A のスレッド A は待機します。Process-B の Binder スレッドがメソッド呼び出しを終了した後にのみ、Thread A に通知され、作業が再開されます。

私の質問: これは標準的な動作ですか? もしそうなら、それはなぜですか?void メソッドの場合、スレッド A は待機しません。(「oneway」はそれに関係していますか?)

私のコード:

プロセス A:

Log.d("Text", "Lior: Client: Thread: " + Thread.currentThread().getName() + " Passing parcelableClass:     parcelableClass.hashCode: " + parcelableClass.hashCode());
for(int i = 0; i < 1; i++) {

_iRemoteServiceBinder.passObject(parcelableClass);

}
Log.d("Text", "Lior: Client: Thread: " + Thread.currentThread().getName() + " Passed parcelableClass:     parcelableClass.hashCode: " + parcelableClass.hashCode());

プロセス B:

private final IRemoteServicePassObject.Stub _binder = new IRemoteServicePassObject.Stub() {

    @Override
    public void passObject(ParcelableClass parcelableClass)
            throws RemoteException {

        Log.d("Text", "Lior: Service: got pacelableClass: a: " + parcelableClass.getA() + 
                " b: " + parcelableClass.getB() + 
                " s: " + parcelableClass.getS() + " hashCode: " + parcelableClass.hashCode()
                + " Running thread: " + Thread.currentThread().getName());

        try {

            Thread.currentThread().sleep(5000);

        } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        Log.d("Text", "Lior: Service: Finished: "
                + " Running thread: " + Thread.currentThread().getName());

私が得ている結果:

01-15 19:52:03.292: D/Text(22792): Lior: クライアント: スレッド: メイン 渡す parcelableClass: parcelableClass.hashCode: 1096225792 01-15 19:52:03.297: D/Text(23014): Lior: サービス: 取得したpaclableClass: a: 1 b: 2 s: String hashCode: 1096136272 実行中のスレッド: Binder スレッド #2 01-15 19:52:08.302: D/Text(23014): Lior: Service: Finished: 実行中のスレッド: Binder Thread #2 01-15 19:52:08.312: D/Text(23014): Lior: サービス: 実行中の新しいスレッド: LiorThread 01-15 19:52:10.342: D/Text(22792): Lior: クライアント: スレッド: メイン渡された parcelableClass: parcelableClass.hashCode: 1096225792

4

1 に答える 1

0

答えを見つけました。

リモート メソッドを呼び出しているスレッドは、リモート プロセスでメソッドが終了するまで待機しています。呼び出しを非同期にするには、AIDL を一方向として定義する必要があります。例: oneway インターフェース IRemoteServiceOnewayAIDL {

于 2013-01-20T16:09:54.817 に答える