31

バックグラウンド スレッドを開始および維持する Android サービスがあります。

ときどき、バックグラウンド スレッドはメイン スレッドでコールバックを実行する必要があります。私はこれを行う方法について困惑しています。

「this」はActivityではなくServiceのインスタンスであり、ServiceにはrunOnUiThreadメソッドがないため、this.runOnUiThreadを呼び出すことはできません。

AsyncTask のドキュメントには、コンストラクターと実行メソッドの両方を UI スレッドから呼び出す必要があると記載されているため、AsyncTask を作成または実行することもできません。

サービスを使用しているアクティビティへの参照を保持してその runOnUiThread メソッドを呼び出す必要がありますか? または、UI スレッドで何かを実行する別の方法がありますか?

ありがとう。

4

5 に答える 5

74

(何らかの理由で) アクティビティに直接アクセスできない場合、次のコードを時々使用しています。

new Handler(Looper.getMainLooper()).post(mYourUiThreadRunnable);
于 2012-06-25T23:51:09.810 に答える
1

あなたの活動 サービスにバインドできる必要があります

http://developer.android.com/guide/components/bound-services.html

具体的には、そのページでメッセンジャーを作成する方法を見てください。クライアントアクティビティは、サービスからのメッセージに応答するメッセンジャーオブジェクトを提供し、受信すると、ハンドラーを使用してUIスレッドで必要なUIコードを実行できます。

アクティビティの参照をサービスに保持しないでください。これは、あらゆる種類のメモリの問題につながる可能性があります。

于 2012-06-25T23:43:47.040 に答える
1

もちろん。ハンドラーを参照してください。サービスにハンドラーオブジェクトを与えることができ、サービスがUIスレッドでRunnableタスクを実行する必要がある場合は、handler.post(some_runnable_task)を呼び出す必要があります。この呼び出し。このリンクで例を見つけることができます4.チュートリアル:ハンドラー。

于 2012-06-25T23:49:12.397 に答える