サービス(IntentService)からアクティビティ(サービスからの応答をキャッチするレシーバーを実装する)にデータベースカーソルを送信しようとしています。クエリからデータを取得したらcursor = db.query(DBHelper.DB_BOOKS_TABLE, columns, where, whereArgs, groupBy, having, orderBy);
、カーソルをサービスから受信者を介して発信者に送り返したいと思います。しかし、バンドル構造により、ティカルデータ(文字列、整数、そのように考えられます)を送信できます。バンドルにより、パーセル可能なオブジェクトとシリアライズ可能なオブジェクトも送信できることを知っています。しかし、典型的なカーソルをパーセル可能またはシリアライズ可能なカーソルに変換するにはどうすればよいですか。ありがとう。
2 に答える
からにBundle
何かを送信するために、実際には a を使用する必要はありません。でこのようにできます。私は以前にそれらを使用したことがないので、ここでは ではなくa について厳密に話しています。バウンドの使用も同じですが、使い終わったらアクティビティを呼び出すだけです。Service
Activity
Service
Service
IntentService
Service
unbindService()
private Cursor cursor;
public void initializeCursor() {
cursor = Cursor();
//Now the cursor is created. Send a broadcast to the activity that it's done.
broadcastManager.sendBroadcast("your.package.CURSOR_FINISHED");
}
次のgetCursor()
メソッドがありActivity
ます。
public Cursor getCursor() {
return this.cursor;
}
の で、次のイベントをキャッチしBroadcastReceiver
ます。Activity
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals("your.package.CURSOR_FINISHED") {
Cursor cursor = myService.getCursor();
unbindService(myServiceConnection);
}
}
アクティビティがサービスにバインドされているため、アクティビティでサービス オブジェクトを利用できます。カーソルが完了したというブロードキャストを取得したら、サービスを強制終了します。
Parcelable Interfaceを実装する独自のカスタム クラスを作成することにしました。CrossProcessCursorのようなパーセル可能なカーソルは、私にはまったく知られていないためです。
私自身の ParcelableRow の内部では、HashMapオブジェクトを実装するだけです。行や列の量を気にする必要がなくなるように、カーソルを自分の ParcelableRow オブジェクトにマップするだけです。ここにmiコードがあります:
public class ParcelableRow implements Parcelable {
private HashMap<String, String> colsMap;
public static final Parcelable.Creator<ParcelableRow> CREATOR
= new Parcelable.Creator<ParcelableRow>() {
@Override
public ParcelableRow createFromParcel(Parcel source) {
return new ParcelableRow(source);
}
@Override
public ParcelableRow[] newArray(int size) {
return new ParcelableRow[size];
}
};
public ParcelableRow(Parcel in) {
colsMap = new HashMap<String, String>();
readFromParcel(in);
}
public ParcelableRow() {
colsMap = new HashMap<String, String>();
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
for(String key: colsMap.keySet()){
dest.writeString(key);
dest.writeString(colsMap.get(key));
}
}
public void readFromParcel(Parcel parcel) {
int limit = parcel.dataSize();
parcel.setDataPosition(0);
for(int i = 0; i < limit; i++){
colsMap.put(parcel.readString(), parcel.readString());
}
}
public void addNewCol(String colName, String colValue){
colsMap.put(colName, colValue);
}
public String getColumnValue(String colName){
return colsMap.get(colName);
}
手がかりをくれた@CommonsWareに感謝します。いいぞ!。
これが誰かの役に立つことを願っています。私のニーズを満たすことができるものを見つけるために数日を費やしました. ここに私が使用したいくつかのコード例があります。アドバイスは大歓迎です。
警告私は時間に逆らっているので、それは私を満足させるだけです.
コーディングを続けてください!