Android UiThread(UIスレッド)とは何ですか


81

誰かが私にUIスレッドが正確に何であるかを説明できますか?development.android.comでは、runOnUiThread関数について説明しています。

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

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

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

ありがとうございました

回答:


144

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

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

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

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

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

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

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


3
素晴らしい説明、特にアプリの基礎へのリンクは、私のようなすべての初心者にとって必読です:)
Java Student

1
ほとんどの場合、のAsyncTask代わりにを使用するべきではありませんrunOnUiThreadか?
JDJ 2014年

5
@ JDJ2つのテクニックには異なる目的があります。AsyncTaskメインスレッドからバックグラウンドに移動します。runOnUiThread()バックグラウンドからメインスレッドに移動します。したがって、それはあなたが達成しようとしていることに依存します。
リチャードルメスリエ2015年

10

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

GUIプログレスアップデートが必要な場合(プログレスバーなどを介して)、publishProgress内部を呼び出しますdoInBackground。これにより、後続の呼び出しonPublishProgressUIスレッドで実行されることが保証されます

onPostExecutedoInBackground返品後に自動的に呼び出されます。


5

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


UI以外のスレッドでウィジェットのデータ構造(レイアウトを膨らませるなど)を準備し、後でUIスレッドで描画できますか?
SMBiggs 2012

試したことはありませんが、inflateはデータ構造を作成するだけなので、技術的には可能です。uがアクティビティなどにアタッチするときの部分は、UIThreadコンテキストでそれを行う必要があるときです。
the100rabh 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.