- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我使用 Retrofit 从 REST API 检索数据。我没有使用 Retrofit 通常的响应,而是使用 RxJava 的 Observable。在 onNext(Object obj)
回调方法中,我告诉 View 在 map 上为我通过 API 收到的每个项目显示标记。此外,我想将每个条目保存到 Realm 数据库中。
保存到数据库有效。但是,它会在相当长的一段时间内阻塞 UI,有时会导致多达 1000 个跳帧。如果没有 Realm 部分,显示所有标记——尽管一次超过 3000 个(出于性能和可用性原因,我将它们聚集在一起)只需要几分之一秒。不过,有了它,应用程序似乎会卡住几秒钟。
不过,保存到数据库是可行的——Realm 会填充所有条目。但这太慢了。
(我做了一些重命名并缩短了代码,然后将其粘贴到此处以仅显示我认为可能有问题的部分。)
MapsPresenter.java
class MapsPresenter implements Presenter<MapsView> {
private MapsView mapsView;
private Subscription subscription;
private MyApiClient apiClient;
private Realm realm;
MapsPresenter() {
apiClient = MyApp.getMyApiClient();
realm = RealmController.with(MyApp.getInstance()).getRealm();
}
void loadRetailers(...) {
if (subscription != null && !subscription.isUnsubscribed()) {
subscription.unsubscribe();
}
mapsView.showProgressIndicator();
subscription = apiClient.retailers()
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.flatMap(new Func1<Retailers, Observable<Retailer>>() {
@Override
public Observable<Dealer> call(Retailers retailers) {
return Observable.from(retailers.retailerList);
}
})
.subscribe(new Subscriber<Dealer>() {
@Override
public void onCompleted() {
...
}
@Override
public void onError(Throwable e) {
...
}
@Override
public void onNext(Retailer retailer) {
realm.beginTransaction();
realm.insertOrUpdate(retailer);
realm.commitTransaction();
}
});
}
}
}
RealmController.java
public class RealmController {
private static RealmController instance;
private final Realm realm;
public RealmController(Application application) {
realm = Realm.getDefaultInstance();
}
public static RealmController with(Application application) {
if (instance == null) {
instance = new RealmController(application);
}
return instance;
}
public static RealmController getInstance() {
return instance;
}
public Realm getRealm() {
return realm;
}
...
}
如何提高插入/更新 Realm 条目的速度,即使 API 调用后有几百个操作?我忽略了什么吗?
最佳答案
首先,非常喜欢您组织问题的方式。
您的 flatMap 代码应该在您的 subscribeOn 之上,以使其在 observeOn 中给定的调度程序上运行。现在该代码正在 MainThread 上运行。
您正在 MainThread 上执行 Realm 写操作,这很好,但您没有使用 Realm 提供的 Aync 方法,请尝试在 executeTransactionAsync block 中执行写操作。
这与您面临的问题无关,但您在 Presenter 中处理订阅的方式可以改进。
示例如下所示,
public void fetchGitHubUsersFromRetrofit() {
internetConnection.isInternetOn(context)
.filter(connectionStatus -> connectionStatus)
.switchMap(connectionStatus -> gitHubApiInterface.getGitHubUsersList())
.subscribeOn(rxSchedulerConfiguration.getComputationThread())
.observeOn(rxSchedulerConfiguration.getMainThread())
.map(gitHubUserList -> {
realm.executeTransactionAsync(realm -> realm.copyToRealmOrUpdate(gitHubUserList));
});
}
如果您正在寻找详细的代码引用,请查看此 https://github.com/viraj49/Realm_android-injection-rx-test
关于android - RxJava onNext 中的 Realm 事务卡住应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38552813/
我有两个问题: 'bind(onNext:' 和 'subscribe(onNext:' 有什么区别? struct Info { var index: Int? var data:
在一个使用 RxJava 2 的 Android 项目中,我在初始 Activity 的 onCreate 中创建了一个像这样的 Flowable: Flowable.create(new MyFlo
我有一个函数可以从网络服务中获取一些信息: const rxjs = require('rxjs'); const request = require('request'); const moment
所以我有一个Observable。我想知道什么时候 每个 下游订阅者 onNext 调用将要进行,这既是为了测量每个下游订阅者花费的时间量,也是为了背压目的。 Observable.lift 让我完成
我是 Rx 的新手,我真的很感激在错误处理方面的一些帮助。我有以下代码,它基本上是预先输入的: var observable = Rx.Observable.fromEvent(searchField
有没有办法延迟某些值的onNext?,例如: let subject = new Rx.BehaviorSubject({value: 100}) subject.onNext({ value: 12
下面我有向两个 API 端点发出请求的代码。我正在寻找一种让 onNext() 函数仅触发一次的方法。现在,如果您运行下面的代码,您可以看到它 logs fire 1,然后是 fire 2。我只想让它
我有一个发出长值的可观察值。一旦我收到一个>0的长值,那么我只需要中断发出并点击onComplete。有没有比我所做的黑客方法更好的方法来做到这一点 long id = -1l; methodA()
我正在尝试使用 RxJava 创建模型的代理,该代理允许其他人订阅模型中的更改。 这是我的代理的简化版本: class MyModelProxy { private static MyMode
我正在用 Retrofit 调用一个 url,我不关心结果。无论如何要忽略 onNext 方法吗? 目前我正在使用: getRetrofit().create(UserAPI.class)
我正在使用 RxAndroid 库来处理使用订阅者/可观察模式的项目列表。我的问题是,当一个项目被处理时,有一个进度条需要更新。但是在处理了 16 个项目之后,似乎 observable 没有调用 o
我有一个创建新 Observable 的用例: Observable.create(new Observable.OnSubscribe() { @Override public void
PublishSubject 非常适合在观察者和可观察对象之间架起一座桥梁: Observable observable = Observable.just("string"); Pu
有没有更简洁的方法来执行以下操作? 我有一个 Android observable 可以消除请求。 onNext 它调用第二个可观察对象。 {// when creating the android
我想在调用 onNext 后 10 秒发出一个随机值。所以 onNext 将被调用 12345,10 秒后 onNext 应该被调用以获得一个随机数。使用 RxJava 实现此目的的最佳方法是什么?提
每隔一段时间我都会用特定的查询检索推文。这些推文必须传递给计算和操作这些推文的服务。所以这些服务订阅了我的出版商。所以 publisher.hasSubscribers() 返回 true。但是提交或
我正在尝试在我的 http 代码中使用一些 reactiveX。为此,我创建了一个主题,并尝试调用 onNext 函数,但我收到一条错误消息,指出 subject.onNext 不是一个函数。 htm
我有这个简单的 retrofit2 api 接口(interface),其中包含 interface Api { @GET(BuildConfig.END_POINT) Observable
有人可以告诉我这个插件是如何工作的 http://bootstraptour.com/api/ ?我有一个步骤,我想重定向到动态网址。所以我编写了 onNext 回调,如下所示的代码。重定向工作正常,
我在 GRPC 文档中找不到任何与此相关的内容。 GRPC 是否期望我的 StreamObserver.onNext() 实现是非阻塞的?如果 GRPC 确实阻塞(例如拒绝新请求、对新请求排队等),会
我是一名优秀的程序员,十分优秀!