32

アクティビティのスレッドまたはサービスのスレッドに長いネットワークアクセスコードを配置することの長所/短所は何ですか?アプリケーションにどのように影響しますか?私はストリーミングオーディオプレーヤーを書いていますが、これまで読んだことから、コードをサービスに入れるとアプリケーションがブロックされるため、新しいスレッドが必要になります。このコードを置く方が理にかなっているのかどうかは誰にもわかりません。サービスで。

4

3 に答える 3

39

はい、サービスでのブロック操作は引き続きアプリケーションをブロックします。最初の外観にもかかわらず、サービスは単にバックグラウンドでタスクを実行するためのものではありません。これらは、アクティビティのライフサイクルから独立したライフサイクルでタスクを実行するためのものです(つまり、アクティビティが閉じられた後も続行できます)。

アクティビティの開始時に開始し、アクティビティの終了時に終了するサービスは役に立ちません。

オーディオをストリーミングしている場合、ユーザーがアクティビティを閉じた後でもオーディオをストリーミングしたい場合があります。その場合は、サービスを使用する必要がありますが、タスクをブロックするためのスレッド(またはAsyncTask)が必要です。 。

于 2010-04-13T21:46:56.700 に答える
2

私の経験(Androidの開発で1年以上)から、サービスとアクティビティで新しいスレッドを実行することに違いはありません。新しいスレッドでアクティビティへの参照を保持しないようにしてください-アプリケーションコンテキストを使用してください。

また、一部のメソッドが呼び出されることが保証されていないため、サービスのライフサイクルはまったく役に立ちませんでした:(

唯一の違いは、アプリを完全に破棄せずにサービスを破棄できることです。したがって、新しいスレッドが破棄される可能性があります。なぜ潜在的に?実用面では、これは起こらないからです。アプリは常にその前にサービスを強制終了せずに強制終了されます。つまり、ローカルサービスメカニズムは役に立ちません!!!

リモートサービスは別の議論です-私は「新しいスレッドをどこで実行すべきか」だけに言及していました。

幸運を!!!

于 2012-03-22T14:56:57.940 に答える
0

違いは、システムがアプリケーションプロセスのライフサイクルを管理する方法です。スレッドの実行はアプリケーションプロセスのライフサイクルに影響しませんが、サービスは影響します。

メモリが不足しているときにどのプロセスを強制終了するかを決定するために、Androidは、各プロセスで実行されているコンポーネントとそれらのコンポーネントの状態に基づいて、各プロセスを重要度階層に配置します。アプリに表示可能なアクティビティまたはフォアグラウンドサービスがないが、バックグラウンドサービスがある場合、アプリはサービスプロセスとして分類され、優先度の低いキャッシュプロセスが存在する間、存続します。ただし、アプリに表示可能なアクティビティ/フラグメント、フォアグラウンドサービス、バックグラウンドサービスがない場合、アプリはキャッシュプロセスとして分類され、実行中のスレッドがあるかどうかに関係なく、いつでも強制終了してシステムリソースを解放できます。

しかし、バックグラウンドサービスを急いで作成しないでください。最近では、バックグラウンドタスクを処理するためのより現代的なアプローチがあります。以下およびバックグラウンド処理ガイドで説明されている代替ソリューションを検討し、バックグラウンドサービスに関連するすべての制限に留意してください。

結果がアクティビティによってのみ必要とされるタスクをスレッドが実行する場合、スレッドのライフサイクルはアクティビティにバインドする必要があります。このような場合、サービスは必要ありません。これはいわゆる即時タスクです。ViewModel + Kotlinコルーチン+ ViewModelScopeは、これを処理するための優れた方法です。さまざまな種類のバックグラウンドタスクの詳細については、バックグラウンド処理のガイドを参照してください。

ユーザーがアプリを閉じたかどうかに関係なくタスクを完了する必要があり、すぐに実行する必要がない場合は、そのような延期されたタスクを処理するための優れた方法であるWorkManagerの使用を検討してください。Android Work Managerとサービスを参照してください?詳細については。

そうでなければ、ライフサイクルがアクティビティ/フラグメントにバインドされていない即時のタスクがある場合、特にオーディオプレーヤーの場合、フォアグラウンドサービスが最良の選択である可能性があります。Android 8以降、バックグラウンドサービスを考慮するといくつかの制限があります。システムは、アプリを閉じてから数分でアプリのバックグラウンドサービスを停止するため、長時間実行されるタスクの場所ではありません。

于 2020-06-16T15:13:17.073 に答える