0

Virgil の android rest google io ビデオを見て、それを実装しようとしました。

要するにこれが問題ですが、詳細については読み進めてください。

ContentResolver クエリ -> コンテンツ プロバイダー クエリ -> データベース更新サービスを開始、クエリを作成、カーソルを返す

サービス -> データベースの更新 -> ブロードキャスト データベースの更新

アクティビティ -> ブロードキャストの登録 -> Contentresolver クエリの受信時。(私たちは最初に戻った)

これが無限ループになりました。

私のコンテンツ プロバイダーでは、クエリ メソッド用です。rest サービスを利用した Intent サービスを開始します。次に、query メソッドがローカル データベースにクエリを実行し、カーソルを返します。インテント サービスの onhandle() メソッドで、Web サービスから新しいコンテンツを取得し、データベースに書き込みます。次に、アクションを含むローカル ブロードキャストを送信します。

私のアクティビティでは、ブロードキャストと onreceive() を登録します。contentresolver.query を呼び出して、データベースから新しいコンテンツを取得します。これは明らかに循環問題を引き起こしています。コンテンツ プロバイダーの query..service..broadcast に戻りました。

受信後にブロードキャストを停止できるようにしたい。

どうすればこれを解決できますか。コンテンツ リゾルバーではなく SQLitedatabase クエリを使用する必要がありますか? または、ブロードキャストを別の方法で送信する必要があります。BroadcastAfterUpdateOn や Off などのコンテンツ リゾルバ クエリで別のパラメータを送信できますか? コンテンツ リゾルバーを派生させ、カスタム クエリ メソッドを作成する必要がありますか?

4

1 に答える 1

0

REST 結果に新しいアイテムがない場合は、通知を送信しません。

long id = db.insertWithOnConflict(getTableName(), null, values, SQLiteDatabase.CONFLICT_IGNORE);
if (id < 0) {
  return null;
}
Uri newUri = ContentUris.withAppendedId(getContentURI(), values.getAsInteger(getIdFieldName()));
Log.d(TAG, "New profile URI: " + newUri.toString());
getContext().getContentResolver().notifyChange(newUri, null);
于 2013-07-05T05:42:56.400 に答える