バインドされたサービスがあります。たとえば、サービスには、アクティビティが閉じられた場合に実行を継続する必要がある非常に集中的な計算を行うメソッド calculate() があります (そのため、asynctask ではなくサービスが選択されます)。そして、このサービスは、再度開いたときにアクティビティに表示されるはずの結果値を返します。質問は次のとおりです。何らかの値を返す必要がある場合、バインドされたサービスで ANR エラーを適切に回避する方法は?
2 に答える
これを使用している場合でもService
、スレッド (または AsyncTask) が必要ないわけではありません。実際に必要です。
サービス参照からの抜粋:
サービスは、他のアプリケーション オブジェクトと同様に、ホスティング プロセスのメイン スレッドで実行されることに注意してください。つまり、サービスが CPU を集中的に使用する操作 (MP3 再生など) またはブロックする操作 (ネットワークなど) を実行する場合、その作業を実行する独自のスレッドを生成する必要があります。
したがって、ANR を避けるために をのAsyncTask
中に入れます。Service
アップデート:
AsyncTask を使用すると、UI スレッドを適切かつ簡単に使用できます。このクラスを使用すると、スレッドやハンドラーを操作することなく、バックグラウンド操作を実行し、UI スレッドで結果を発行できます。
以下を使用してメインスレッドを更新できます。
onProgressUpdate(Progress...) は、publishProgress(Progress...) の呼び出し後に UI スレッドで呼び出されます。実行のタイミングは未定義です。このメソッドは、バックグラウンド計算がまだ実行されている間に、ユーザー インターフェイスに任意の形式の進行状況を表示するために使用されます。たとえば、進行状況バーをアニメーション化したり、テキスト フィールドにログを表示したりするために使用できます。
Service の calculate() にも Thread または asynctask を使用します。