gpt4 book ai didi

android - RxJava onNext 中的 Realm 事务卡住应用程序

转载 作者:搜寻专家 更新时间:2023-11-01 09:44:39 26 4
gpt4 key购买 nike

设置

我使用 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 调用后有几百个操作?我忽略了什么吗?

最佳答案

首先,非常喜欢您组织问题的方式。

  1. 您的 flatMap 代码应该在您的 subscribeOn 之上,以使其在 observeOn 中给定的调度程序上运行。现在该代码正在 MainThread 上运行。

  2. 您正在 MainThread 上执行 Realm 写操作,这很好,但您没有使用 Realm 提供的 Aync 方法,请尝试在 executeTransactionAsync block 中执行写操作。

  3. 这与您面临的问题无关,但您在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com