私は現在、Android アプリを作成しており、HttpClients とそれらのクラスを使用していました。メインスレッドでその操作を行うことはできないという投稿を読むまで、いくつかのエラーを修正するのに 2 時間を費やしました。だから彼らは私が AsyncTask を使うことを提案しました。
だから私の質問は、別のスレッドでどの操作を行うべきかをどうやって知るのですか? それらを読むことができるリストはありますか?
どんな情報でも構いません、事前に感謝します。
私は現在、Android アプリを作成しており、HttpClients とそれらのクラスを使用していました。メインスレッドでその操作を行うことはできないという投稿を読むまで、いくつかのエラーを修正するのに 2 時間を費やしました。だから彼らは私が AsyncTask を使うことを提案しました。
だから私の質問は、別のスレッドでどの操作を行うべきかをどうやって知るのですか? それらを読むことができるリストはありますか?
どんな情報でも構いません、事前に感謝します。
NetworkOnMainThreadException
アプリケーションがメイン スレッドでネットワーク操作を実行しようとすると、Aがスローされます。これは、Honeycom SDK 以降を対象とするアプリケーションに対してのみスローされます。以前のバージョンの SDK を対象とするアプリケーションは、メイン イベント ループ スレッドでネットワークを実行できますが、推奨されません。
ICS と HoneyComb が UI スレッドで実行できないその他の操作の例を次に示します。
これらの操作のいずれかを UI スレッドで実行しようとしている場合は、それらをワーカー スレッドでラップする必要があります。これを行う最も簡単な方法はAsyncTask
、ユーザー インターフェイスで非同期作業を実行できる を使用することです。はAsyncTask
、ワーカー スレッドでブロッキング操作を実行し、結果を UI スレッドで発行します。スレッドやハンドラーを自分で処理する必要はありません。
ネットワーク例外は、UI スレッドをブロックすることによって Android でスローされる唯一の例外です。したがって、Android でプログラミングを行う場合は、3 つのルールを念頭に置く必要があります。
完了までに 5 秒以上かかる操作を UI スレッドに処理させないでください。
onReceive () を完了するのに 20 秒以上かかる操作をブロードキャスト レシーバに処理させないでください。
また、UI スレッドでネットワーク操作を処理しないでください。
他の回答が言っているように、Android はスレッドセーフではありません。つまり、次のことを意味します。
この種の他の操作には、大量のデータの処理/データベース操作/HTTP 要求/ネットワーク管理が含まれる場合があります。実際、UI スレッドを必要としないものの処理時間が長いものは、別のスレッドに移動する必要があると思います。
これは論理的に理にかなっています。なぜなら、重い処理を行うと、ユーザーはラグを感じ、ユーザー エクスペリエンスが損なわれるからです (そして、もちろん、システムの過負荷などに使用される可能性があります)。ハニカムを処理してエラーをスローします。
その結果、非同期タスクを使用する必要があります。
非同期タスクは、重い処理やネットワーク接続を実行できる新しいスレッドを開くだけです。ネットワーク接続については、 AsyncTaskを使いやすい形式で実装する、このような AsyncClientsの使用をお勧めします。グリッド/リストに画像をロードできるUniversalImageLoaderのようなライブラリもあります。
また、これについて説明している Android の公式ドキュメントを読むことを強くお勧めします。これについては、Android ブログにも役立つ投稿があります。最後に、発生したエラー (UI スレッドで操作を実行したためのエラー) が含まれている可能性があるため、この投稿が役立つ可能性があると思います。
私が見つけた他のリソース:
結論として、使用されている AsyncTask の例を次に示します。(@Graham Smithからの回答をうまく入れてください)。
時間がかかるものは、別のスレッドで実行する必要があります。これには、大規模な IO とネットワーク アクセスが含まれます。ただし、ネットワーク アクセスのみが例外をスローすると思います。それ以外の場合は、UI が応答しなくなります。ただし、時間がかかりすぎると、ウォッチドッグ タイマーが作動し、アプリが強制終了されます。
Gabe が述べたように、負荷の高いタスクは別のスレッドで実行する必要があります。
Android スレッドには 2 つの重要な点があります。
1は共通のスレッドです..(あなたが尋ねたことをするスレッド)
2はUIスレッドです...(ユーザーの反応を聞いてUIを描画するスレッド)
ui スレッドでのみ ui(Views act) を変更できます。
一方、ハニカムの後、メインスレッドで http リクエストを行うことは禁止されています。(厳密モードと呼ばれます)
つまり、ユーザーの操作をブロックする操作は、別のスレッドで実行する必要があります。
これがお役に立てば幸いです。