RxJava と Retrofit を組み合わせてネットワーク API を実装しており、データベースとして Realm を使用しています。私はそれをかなりうまく機能させましたが、それが正しいアプローチとイベントの流れであるかどうか疑問に思っています。だから、ここにありRetrofitApiManager
ます。
public class RetrofitApiManager {
private static final String BASE_URL = "***";
private final ShopApi shopApi;
public RetrofitApiManager(OkHttpClient okHttpClient) {
// GSON INITIALIZATION
Retrofit retrofit = new Retrofit.Builder()
.client(okHttpClient)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.baseUrl(BASE_URL)
.build();
shopApi = retrofit.create(ShopApi.class);
}
public Observable<RealmResults<Shop>> getShops() {
return shopApi.getShops()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(response -> {
Realm realm = Realm.getDefaultInstance();
realm.executeTransaction(realm1 ->
realm1.copyToRealmOrUpdate(response.shops));
realm.close();
})
.flatMap(response -> {
Realm realm = Realm.getDefaultInstance();
Observable<RealmResults<Shop>> results = realm.where(Shop.class)
.findAllAsync()
.asObservable()
.filter(RealmResults::isLoaded);
realm.close();
return results;
});
}
}
そして、ここRealmResults<Shop>
に a の中に入る呼び出しがありFragment
ます。
realm.where(Shop.class)
.findAllAsync()
.asObservable()
.filter(RealmResults::isLoaded)
.first()
.flatMap(shops ->
shops.isEmpty() ? retrofitApiManager.getShops() : Observable.just(shops))
.subscribe(
shops -> initRecyclerView(),
throwable -> processError(throwable));
ここに私の質問があります:
上記の例のようにイベントをチェーンするのは正しいアプローチですか、それとも別の方法で管理する必要がありますか?
Realm
メソッドでインスタンスを使用してgetShops()
そこで i を閉じても問題ありませんか、それとも引数として渡してから何らかの方法で管理する方がよいでしょうか? ただし、このアイデアは、スレッドとRealm.close()
常に適切なタイミングで呼び出すには少し問題があるようです。