Я реализую сетевой API с комбинацией RxJava и Retrofit, и я использую Realm в качестве моей базы данных. Я получил это довольно много работы, но мне интересно, если это правильный подход и поток событий. Итак, вот RetrofitApiManager
.Правильный поток в RxJava с дооснащением и недвижимостью
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>
внутри 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()
и закрыть его там, или было бы лучше передать его в качестве аргумента, а затем каким-то образом управлять им? Хотя эта идея кажется немного проблематичной для потоков и вызываетRealm.close()
всегда в нужное время.
Я не думаю, что возвращение наблюдаемого в первом фрагменте кода из 2) будет работать, потому что Observable принадлежит экземпляру Realm, который закрывается сразу после получения асинхронного запроса. Но последнее довольно хорошо – EpicPandaForce
@ChristianMelchior @EpicPandaForce Какие могут быть помехи от создания экземпляра нового объекта Realm в 'doOnNext', как это? Не могло ли это стать плохо, если 'doOnNext()' вызывались много раз подряд? Кроме того, какие эффекты оказывает это на объекты, которые вставлены/обновлены, поскольку они вставляются через недавно созданное Realm вместо Realm, которое будет создано в основном потоке? (Искренне прося о моих знаниях). – w3bshark
Нашел ответ на мои вопросы здесь: https://realm.io/news/viraj-tank-safe-vs-deep-integration – w3bshark