3

私はまだスレッドで混乱しています。それでも、スレッド、UI スレッド、バックグラウンド スレッド、メイン スレッドなどを指すいくつかの回答を見ることができました (主に AsyncTasks で、バックグラウンド スレッドからの UI の更新など)。

少なくともこれらまたはいくつかのリンクに関する完全な説明を誰かに教えてもらえますか?

答えが次のケースをカバーしていれば素晴らしいでしょう。

関連するすべてのスレッドは次のとおりです。

  • アクティビティを実行しているとき (コンテンツ ビューの設定、いくつかのボタンの取り付け、いくつかのダイアログ メッセージ)
  • AsyncTask を使用したアクティビティ
  • バックグラウンド サービス
  • HTTP 呼び出し
4

4 に答える 4

1

アクティビティを実行しているとき (コンテンツ ビューの設定、いくつかのボタンの取り付け、いくつかのダイアログ メッセージ)

通常、スレッドは 1 つだけです (メインのスレッドで、UI スレッドと誤って呼ばれることもあります)。


アクティビティ - 非同期タスクあり

繰り返しますが、デフォルトでは 1 つだけ (メインのもの) です。メニューとボタン ハンドラもメイン スレッドで実行されます。AsyncTaskは別の話です。ワーカースレッドを作成します(ところで、アクティビティを終了するときにリークしないように注意する必要があります)。


バックグラウンド サービス

デフォルトでは、サービスはメイン スレッドで実行されます。放送受信機も同様です。これが、メイン スレッドが UI スレッドではない (だけである) 理由です。ただし、一部のタイプのサービス (一般的な などIntentService) は、ワーカー スレッドを生成します。


http 呼び出し

同期操作であるため、完了するまでブロックされます (これが、メイン スレッドで絶対に実行してはならない理由です)。

于 2013-08-02T11:05:59.793 に答える
0

関連するすべてのスレッドは次のとおりです。

アクティビティを実行しているとき (コンテンツ ビューの設定、いくつかのボタンの取り付け、いくつかのダイアログ メッセージ)

ここでは、UI スレッドまたはメイン スレッドが関与します。

AsyncTask を使用したアクティビティ

UI Thread と WorkerThread の両方が関係しています。

AsyncTaskを使用すると、UI スレッドを適切かつ簡単に使用できます。このクラスを使用すると、スレッドやハンドラーを操作することなく、バックグラウンド操作を実行し、UI スレッドで結果を発行できます。

4つのステップ

非同期タスクが実行されると、タスクは次の 4 つのステップを経ます。

  1. onPreExecute()、タスクが実行される前に UI スレッドで呼び出されます。このステップは、通常、タスクをセットアップするために使用されます。たとえば、ユーザー インターフェイスに進行状況バーを表示します。

  2. doInBackground(Params...)onPreExecute()、実行が終了した直後にバックグラウンド スレッドで呼び出されます。このステップは、時間がかかる可能性のあるバックグラウンド計算を実行するために使用されます。このステップはpublishProgress(Progress...)、進行状況の 1 つ以上のユニットを公開するためにも使用できます。これらの値は、UI スレッドのonProgressUpdate(Progress...)ステップで発行されます。

  3. onProgressUpdate(Progress...) への呼び出し後に UI スレッドで呼び出されますpublishProgress(Progress...)。このメソッドは、バックグラウンド計算がまだ実行されている間に、ユーザー インターフェイスに任意の形式の進行状況を表示するために使用されます。

  4. onPostExecute(結果)、バックグラウンド計算が終了した後に UI スレッドで呼び出されます。バックグラウンド計算の結果は、パラメーターとしてこのステップに渡されます。

バックグラウンド サービス

IntentServiceクラスは、単一のバックグラウンド スレッドで操作を実行するための単純な構造を提供します。これにより、ユーザー インターフェイスの応答性に影響を与えることなく、長時間実行される操作を処理できます。

HTTP 呼び出し

NetwokrkOperation は UI スレッド (または MainThread) から実行できません。したがって、AsyncTaskHandlerThreadなどの代替手段を使用してください

関連記事:

ハンドラ vs AsyncTask vs スレッド

Android で HandlerThread を使用する理由

Asynctask vs スレッド vs サービス vs ローダー

于 2017-11-26T09:19:17.343 に答える