web-dev-qa-db-ja.com

Android UiThread(UIスレッド)とは

誰かがUIスレッドが何であるかを私に説明できますか? developer.Android.comでは、runOnUiThread関数について述べています

public final void runOnUiThread(実行可能なアクション)

以来:APIレベル1 UIスレッドで指定されたアクションを実行します。現在のスレッドがUIスレッドである場合、アクションはすぐに実行されます。現在のスレッドがUIスレッドでない場合、アクションはUIスレッドのイベントキューにポストされます。

UIスレッドとは、着信コールや画面の調光などのUIアクティビティによってアクティビティがバックグラウンドにプッシュされるたびにこれが実行されることを意味しますか?そうでない場合、UIスレッドには正確に何が含まれますか?

ありがとうございました

77
user434885

UIThreadは、アプリケーションの実行のメインスレッドです。これは、ほとんどのアプリケーションコードが実行される場所です。すべてのアプリケーションコンポーネント(アクティビティ、サービス、ContentProviders、BroadcastReceivers)はこのスレッドで作成され、これらのコンポーネントへのシステムコールはすべてこのスレッドで実行されます。

たとえば、アプリケーションが単一のActivityクラスであるとしましょう。次に、すべてのライフサイクルメソッドとほとんどのイベント処理コードがこのUIThreadで実行されます。これらは、onCreateonPauseonDestroyonClickなどのようなメソッドです。さらに、UIのすべての更新が行われます。 UIが更新または変更される原因となるものはすべて、UIスレッドで発生します。

アプリケーションのプロセスとスレッドの詳細については、ここをクリックしてください。

バックグラウンドで動作する新しいスレッドを明示的に生成する場合、このコードはUIThreadで実行されません。では、このバックグラウンドスレッドがUIを変更する何かをする必要がある場合はどうなりますか?これがrunOnUiThreadの目的です。実際には、ハンドラーを使用することになっています(詳細については、以下のリンクを参照してください)。これらのバックグラウンドスレッドは、UIを変更できるコードを実行する機能を提供します。これは、UI修正コードをRunnableオブジェクトに配置し、runOnUiThreadメソッドに渡すことでこれを行います。

ワーカースレッドの生成とそれらからのUIの更新の詳細については、ここをクリックしてください

個人的には、インストルメンテーションテストでrunOnUiThreadメソッドのみを使用しています。テストコードはUIThreadで実行されないため、このメソッドを使用してUIを変更するコードを実行する必要があります。そこで、クリックイベントとキーイベントをアプリケーションに注入するために使用します。その後、アプリケーションの状態をチェックして、正しいことが起こったことを確認できます。

IThreadでのコードのテストと実行の詳細については、ここをクリックしてください

137
plainjimbo

別のスレッドでブロッキングコード(たとえば、Http-Request)を実行する場合は、 AsyncTask の使用を検討してください。そのdoInBackground- Methodは別のスレッドで実行されます。 AsyncTaskは、UIスレッドでの実行を保証するメソッドであるonProgressUpdateおよびonPostExecuteメソッドを提供します

GUIプログレスの更新が必要な場合(プログレスバー経由など)、publishProgress内でdoInBackgroundを呼び出します。これは、後続のonPublishProgressの呼び出しにつながります。これは、UIスレッドでの実行が保証されています

onPostExecuteは、doInBackgroundが戻った後に自動的に呼び出されます。

9
Martin Pabst

すべてのUI描画などは別のスレッドで行われます。 UIThreadと呼ばれます。 UIに変更を加える場合は、UIThreadのコンテキストで発生することを確認する必要があります。最も簡単な方法は、runOnUiThreadを使用することです

4
the100rabh