私の仕事は、デバイスのロケーション情報が変更されたときにリモートサーバーのJson APIサービスにプッシュすることです。リモートサーバが利用できない場合、私のDatabaseManagerはそれらをローカルデータベースに保存する必要があります。ここでどのように(RxJava)Observableから放出されるデータをハンドラが処理するかを適切に設定しますか?
は私のレトロフィットAPIです:
public interface GpsService {
@POST("/v1/savelocationbatch")
SaveResponse saveLocationBatch(@Body LocationBatch locationBatch);
}
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(myBaseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
GpsService service = retrofit.create(GpsService.class);
そして、POJOクラス:
public class LocationBatch{
@SerializedName("LocationPointList")
ArrayList<LocationPoint> locationPointList;
@SerializedName("ClientId")
String clientId;
@SerializedName("ClientSecret")
String clientSecret;
//setter & getter
}
マイLocationPointモデル:
@Table(name="LocationPoints", id = "_id")
public class LocationPoint extends Model {
@SerializedName("Latitude")
@Column(name="latitude")
public Double latitude;
@SerializedName("Longitude")
@Column(name="longitude")
public Double longitude;
@SerializedName("Altitude")
@Column(name="altitude")
public Double altitude;
//... setters, getters etc
}
私の最後の場所のすべてがに格納されていますCurrentLocationHolderシングルトン(バッチ送信/保存用) DB/Observableからの放射)。バッファのサイズがMAX_BUFFER_SIZE変数を超えた場合、locationBufferChanged.onNext(引数としてlocationBufferのコピーを使用)を発生させるよりも、setLocation()メソッドはcurrentLocation変数を更新してlocationBufferに格納します。
public class DatabaseManager {
private Subscription locationBufferSubscription;
private static DatabaseManager instance;
public static void InitInstance() {
if (instance == null)
instance = new DatabaseManager();
}
}
public void saveToDb(ArrayList<LocationPoint> locArray){
ActiveAndroid.beginTransaction();
try {
for (int i = 0; i < locArray.size(); i++) {
locArray.get(i).save();
}
ActiveAndroid.setTransactionSuccessful();
}
finally {
ActiveAndroid.endTransaction();
}
}
}
私のアプリケーションの主な目標:
listeneの全てを書き込むにはlocationBuffer ...
public class CurrentLocationHolder {
private List<LocationPoint> locationBuffer =
Collections.synchronizedList(new ArrayList<>());
private LocationPoint currentLocation;
private final PublishSubject<List<LocationPoint>> locationBufferFull =
PublishSubject.create();
public Observable<List<LocationPoint>>
observeLocationBufferFull(boolean emitCurrentValue) {
return emitCurrentValue ?
locationBufferFull.startWith(locationBuffer) :
locationBufferFull;
}
public void setLocation(LocationPoint point) {
this.currentLocation = point;
locationBuffer.add(point);
if (locationBuffer.size() >= MAX_BUFFER_SIZE) {
locationBufferChanged.onNext(new ArrayList<>(this.locationBuffer));
}
locationBuffer.clear();
}
}
そして、ここでは私のDatabaseManagerですd Retrofitを介してHTTPサーバーにLocationPointを転送します。何らかの理由でリモートサーバーが突然停止する(またはインターネット接続が失われる)場合、私のアプリケーションは新しいlocationPointsをシームレスにローカルデータベースに書き込む必要があります。サーバー(またはインターネット)が起動すると、Retrofitの呼び出しに保存されたローカルデータが提供されるメカニズムがあります。
だから、私の質問は以下のとおりです。
- レトロフィットサービスに正常に一覧を放出するのRx-被監視オブジェクトを作成するには、サーバー(またはインターネット)がダウンしたとき、それは提供する必要がありますどのように未保存のLocationPointsをDatabaseManager.saveToDb()メソッドに変換しますか?
- インターネット接続またはサーバーの「アップ」状態を取得するにはどうすればよいですか? Observableを作成してリモートサーバにpingを実行するとよいでしょうか?その結果、サブスクライバにブール値を送信する必要がありますか?この動作を実装する最善の方法は何ですか?
- インターネット接続(サーバ)が「アップ」になったときにローカルに保存されたデータ(ローカルDBから)でRetrofitコールをエンキューする簡単な方法はありますか?
- サーバー側で自分のLocationPointを失わないようにするにはどうすればよいですか? !?(最終的には私のクライアントアプリはそれらのすべてを送信する必要があり
- 私が何か間違ったことをやって、私は、Android、Javaと特にRxJavaに
に初心者アム...