1

私はいくつかの作業を行うサービスを持っています。完了すると、ブロードキャストを送信します。アクティビティでは、受信者が登録され、その onReceive でブロードキャストを取得します。データベースからデータを選択し、リストビュー内に表示する必要があります。しかし、高価な操作になる可能性があるため、UIスレッドでデータベース選択を実行したくありません。非同期タスクを開きたいのですが、それはレシーバーのライフサイクルです。他にどのような解決策がありますか? サービスを開くには?はい、新しいサービスでデータベース操作を実行できますが、サービスからビューにデータを配信するにはどうすればよいですか? サービスからビューを更新することは、私がやりたくないことです。私は今、一種のデッドロックに陥っています。

アイデアをありがとう

編集 1: これは、onReceive で AsyncTask を使用できない理由と、回答が無効である理由の Android ドキュメントからの説明です。

レシーバのライフサイクル BroadcastReceiver オブジェクトは、onReceive(Context, Intent) への呼び出しの間のみ有効です。コードがこの関数から戻ると、システムはオブジェクトが終了し、アクティブではなくなったと見なします。これは、 onReceive(Context, Intent) 実装でできることに重要な影響を与えます。非同期操作を処理するには関数から戻る必要があるため、非同期操作を必要とするものはすべて利用できませんが、その時点で BroadcastReceiver はアクティブではなくなるため、システムは非同期操作が完了する前にそのプロセスを自由に強制終了できます。特に、ダイアログを表示したり、BroadcastReceiver 内からサービスにバインドしたりすることはできません。前者の場合は、代わりに NotificationManager API を使用する必要があります。後者については、

編集2:答えは、アクティビティでハンドラーを作成してレシーバーに渡し、そのonReceiveでメッセージをハンドラーに投稿し、ハンドラー内で非同期タスクを開いてデータベースを処理するという解決策に私を導きました。これが良いものかどうかはわかりません。

4

1 に答える 1

0

私がお勧めするのは、を埋めることができる場所にInterfaceデータを返す を作成することです。でデータベース操作を行い、を使用してにデータを送信し、UI を更新するデモを作成しました。そのため、置き換えて独自のアクションを実行することができます。.ActivityListViewAsyncTaskAsyncTaskActivityInterfaceAsyncTaskServiceHere is a sample demo source for Database Operation in AsyncTask and returning its content to Activity

于 2012-09-03T08:46:12.190 に答える