に localService
とがある場合Service
、 function: がありますdoHeavyThings()
。Activity
でローカルに接続したService
後、UI スレッドでonServiceConnected(...)
呼び出す必要がありますか? mService.doHeavyThings()
UI スレッドをブロックしますか? 誰もそれを説明できますか?前もって感謝します!
2 に答える
Service
常にデフォルトで**はUIスレッドで実行されます。したがって、ANRを回避するために、あなたのdoHeavyThings()
方法は、すべての面倒な作業を行う新しいものを開始するだけである必要がありますThread
。
結果について通知を受けたい場合は、自分で実装する必要があります。たとえば、バックから発信者への通信に使用されるにをMessanger
渡すことができます。Service
Service
Messanger
次の記事では、aを使用してService
双方向通信を提供する
方法について説明しています。http: //developer.android.com/guide/components/bound-services.html
別の方法は、を使用することIntentService
です。あなたはここでそれについてもっと読むことができます:http:
//developer.android.com/reference/android/app/IntentService.html
**-ファイル内の宣言のandroid:process
属性を使用して、別のプロセスで実行できます。(クラススタッカーに感謝)<service>
AndroidManifest.xml
サービスが結果を非同期的に (コールバック経由で) 配信するか、同期的に配信するかによって異なります。
結果を同期的に配信する場合は、UI スレッドでこれらのメソッドを呼び出さないでください。サービスとバインダー スレッドが実際の作業を行っている間、UI スレッドは単に結果を待つという事実にもかかわらず、UI スレッドは制御フローのために待機するため、UI は依然としてブロックされます。
したがって、AsyncTask、HandlerThread、または Thread を使用してください。
Service が結果を非同期で配信する場合、ほとんどの場合、UI スレッドからメソッドを呼び出すことができます。