0

onStartCommand のコードがメイン スレッドで実行されることはわかっています。このメソッド内で、サーバーと通信する新しいネットワーク スレッドを生成し、それが終了すると、メイン スレッドでも実行されるコールバック メソッドを実行します。

私の質問は、両方のメソッド onStartCommand とコールバック メソッドがメイン スレッドで実行され、ネットワーク呼び出しが終了するたびにコールバック メソッドが実行される場合、コールバック メソッドのコード行が途中で実行される可能性はありますか? onStartCommand メソッドの実行?

これはどのように作動しますか?

4

1 に答える 1

1

生成されたネットワーク スレッドが、メイン スレッドで実行されることが確実な関数呼び出しを行う場合、これを実現する唯一の方法は、ある種の共有リソースを使用することです。最も一般的な方法は、ある種のワーク キュー、ソケット、または2 つのスレッド間で共有される (メソッド呼び出しによって設定される) 変数で、特定のメソッドを実行するためにメイン スレッドによってポーリングされる必要があります。

最も簡単な方法はワークキューだと思いますが、コメントに投稿したリンクによると、通常は TCP/IP ソケットを使用する JSON に言及しています。それぞれの方法が通常どのように機能するかについて説明します。

ワーク キュー:

ネットワーク スレッドは何らかの作業エントリを作成し、メイン スレッドの作業キューに入れます。メイン スレッドがメソッド (onStartCommand()) の途中にある場合、作業エントリも実行できません。ほとんどの場合、現在のメソッドが終了すると、キューからエントリを取得するポーリング メソッドに戻ります。したがって、このアプローチが使用される場合、onSuccess() と onFailure() は、onStartCommand() から戻った後に実行される作業エントリを作成してキューに入れます。

JSON ソケット:

このアプローチはワーク キューに非常に似ていますが、ワーク エントリの代わりにソケット メッセージが使用されます。また、ソケットを (ほとんどの場合 select() または poll() を介して) ポーリングし、受信したメッセージを作業項目として扱う関数があります。したがって、このアプローチが使用される場合、onSuccess() と onFailure() は、onStartCommand() から戻った後に実行されるソケット メッセージを作成して送信します。

于 2012-09-06T15:41:00.207 に答える