誰かがUIスレッドが何であるかを私に説明できますか? developer.Android.comでは、runOnUiThread関数について述べています
public final void runOnUiThread(実行可能なアクション)
以来:APIレベル1 UIスレッドで指定されたアクションを実行します。現在のスレッドがUIスレッドである場合、アクションはすぐに実行されます。現在のスレッドがUIスレッドでない場合、アクションはUIスレッドのイベントキューにポストされます。
UIスレッドとは、着信コールや画面の調光などのUIアクティビティによってアクティビティがバックグラウンドにプッシュされるたびにこれが実行されることを意味しますか?そうでない場合、UIスレッドには正確に何が含まれますか?
ありがとうございました
UIThreadは、アプリケーションの実行のメインスレッドです。これは、ほとんどのアプリケーションコードが実行される場所です。すべてのアプリケーションコンポーネント(アクティビティ、サービス、ContentProviders、BroadcastReceivers)はこのスレッドで作成され、これらのコンポーネントへのシステムコールはすべてこのスレッドで実行されます。
たとえば、アプリケーションが単一のActivityクラスであるとしましょう。次に、すべてのライフサイクルメソッドとほとんどのイベント処理コードがこのUIThreadで実行されます。これらは、onCreate
、onPause
、onDestroy
、onClick
などのようなメソッドです。さらに、UIのすべての更新が行われます。 UIが更新または変更される原因となるものはすべて、UIスレッドで発生します。
アプリケーションのプロセスとスレッドの詳細については、ここをクリックしてください。
バックグラウンドで動作する新しいスレッドを明示的に生成する場合、このコードはUIThreadで実行されません。では、このバックグラウンドスレッドがUIを変更する何かをする必要がある場合はどうなりますか?これがrunOnUiThread
の目的です。実際には、ハンドラーを使用することになっています(詳細については、以下のリンクを参照してください)。これらのバックグラウンドスレッドは、UIを変更できるコードを実行する機能を提供します。これは、UI修正コードをRunnableオブジェクトに配置し、runOnUiThreadメソッドに渡すことでこれを行います。
ワーカースレッドの生成とそれらからのUIの更新の詳細については、ここをクリックしてください
個人的には、インストルメンテーションテストでrunOnUiThread
メソッドのみを使用しています。テストコードはUIThreadで実行されないため、このメソッドを使用してUIを変更するコードを実行する必要があります。そこで、クリックイベントとキーイベントをアプリケーションに注入するために使用します。その後、アプリケーションの状態をチェックして、正しいことが起こったことを確認できます。
別のスレッドでブロッキングコード(たとえば、Http-Request)を実行する場合は、 AsyncTask の使用を検討してください。そのdoInBackground
- Methodは別のスレッドで実行されます。 AsyncTask
は、UIスレッドでの実行を保証するメソッドであるonProgressUpdate
およびonPostExecute
メソッドを提供します。
GUIプログレスの更新が必要な場合(プログレスバー経由など)、publishProgress
内でdoInBackground
を呼び出します。これは、後続のonPublishProgress
の呼び出しにつながります。これは、UIスレッドでの実行が保証されています。
onPostExecute
は、doInBackground
が戻った後に自動的に呼び出されます。
すべてのUI描画などは別のスレッドで行われます。 UIThreadと呼ばれます。 UIに変更を加える場合は、UIThreadのコンテキストで発生することを確認する必要があります。最も簡単な方法は、runOnUiThread
を使用することです