Android RxJava和Realm请求使应用程序跳过帧

Android RxJava和Realm请求使应用程序跳过帧,android,realm,rx-java2,android-threading,Android,Realm,Rx Java2,Android Threading,我正在android项目中使用RxJava和Realm数据库。但有时按下一个按钮是没有反应的,你必须多次这样做才能让它在某个时候工作,android日志显示xxx帧被跳过。我知道这与滥用UI线程有关。这是我的一些要求,有人能告诉我他们有什么问题吗?Realm希望我在使用响应的同一线程上执行IO请求(但不太确定) public可流动getClothingItemsLocal(){ 返回Flowable.just(dbProvider.getClothingItems(mSortType)); }

我正在android项目中使用RxJava和Realm数据库。但有时按下一个按钮是没有反应的,你必须多次这样做才能让它在某个时候工作,android日志显示xxx帧被跳过。我知道这与滥用UI线程有关。这是我的一些要求,有人能告诉我他们有什么问题吗?Realm希望我在使用响应的同一线程上执行IO请求(但不太确定)

public可流动getClothingItemsLocal(){
返回Flowable.just(dbProvider.getClothingItems(mSortType));
}
公共可流动getClothingItemsRemote(){
return clothingService.getAll(“Bearer”+preferencesManager.getToken())
.map(响应->响应.items)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnSuccess(衣物项目->{
dbProvider.clearClothingItems();
dbProvider.saveorUpdateCothingItems(clothingItems);
})
.toFlowable()
.map(remoteItems->dbProvider.getClothingItems(mSortType));
}
公共可流动getClothingItem(@NonNull final String id){
返回getClothingItemRemote(id)
.startWith(dbProvider.getClothingItem(id))
.onErrorReturn(throwable->dbProvider.getClothingItem(id));
}
使用改进的getAll方法

@GET(BuildConfig.BASE_API_PATH + "clothing_items")
Single<GetClothingItemsResponseModel> getAll(@Header("Authorization") String token);
@GET(BuildConfig.BASE\u API\u路径+“衣服\u项目”)
单个getAll(@Header(“Authorization”)字符串令牌);
领域提供程序方法:

public void saveOrUpdateEvents(List<Event> data) {
    realmInstance.executeTransaction(realm -> {
        for (Event event : data) {
            if (!TextUtils.isEmpty(event.date)) {
                Date date = DateUtils.getFullDate(event.date);
                Timber.d("date %s", date.toString());
                event.timestamp = date;
            }
            Event cashedEvent = getEvent(event.id);
            if (cashedEvent.id != null) {
                event.eventClothingItems = cashedEvent.eventClothingItems;
                event.tags = cashedEvent.tags;
                event.location = cashedEvent.location;
            }
        }
        realm.delete(Event.class);
        realm.insertOrUpdate(data);
    });
}



public void clearClothingItems() {
    realmInstance.executeTransaction(realm -> {
        realm.delete(ClothingItem.class);
    });
}
public void saveOrUpdateEvents(列表数据){
realmInstance.executeTransaction(领域->{
用于(事件:数据){
如果(!TextUtils.isEmpty(event.date)){
Date-Date=DateUtils.getFullDate(event.Date);
Timber.d(“日期%s”,date.toString());
event.timestamp=日期;
}
Event cashedEvent=getEvent(Event.id);
如果(cashedEvent.id!=null){
event.eventClothingItems=cashedEvent.eventClothingItems;
event.tags=cashedEvent.tags;
event.location=cashedEvent.location;
}
}
realm.delete(Event.class);
realm.insertOrUpdate(数据);
});
}
公共无效clearClothingItems(){
realmInstance.executeTransaction(领域->{
realm.delete(ClothingItem.class);
});
}
试试这个:

public Flowable<List<ClothingItem>> getClothingItemsRemote() {
    return clothingService.getAll("Bearer " + preferencesManager.getToken())         
            .subscribeOn(Schedulers.io())   
            .map(response -> response.items) 
            .observeOn(AndroidSchedulers.mainThread())
            .doOnSuccess(clothingItems -> {
                dbProvider.clearClothingItems();
                dbProvider.saveOrUpdateClothingItems(clothingItems);
            })     
            .observeOn(Schedulers.computation())
            .toFlowable()
            .map(remoteItems -> dbProvider.getClothingItems(mSortType));
}
公共可流动getClothingItemsRemote(){
return clothingService.getAll(“Bearer”+preferencesManager.getToken())
.subscribeOn(Schedulers.io())
.map(响应->响应.items)
.observeOn(AndroidSchedulers.mainThread())
.doOnSuccess(衣物项目->{
dbProvider.clearClothingItems();
dbProvider.saveorUpdateCothingItems(clothingItems);
})     
.observeOn(Schedulers.computation())
.toFlowable()
.map(remoteItems->dbProvider.getClothingItems(mSortType));
}

im我建议您在
.map
之前使用
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.io())
。有两个map函数,在哪一个之前?我要在它们前面说,我不是专家,但是您可以尝试一下,这是因为您的
dbProvider
没有考虑领域实例是线程本地的,因此您被绑定到UI线程。但是我必须修改
dbProvider
中的代码来解决这个问题。如何修改?我应该更改什么我遇到了以下错误:
java.lang.IllegalStateException:从错误线程访问领域。域对象只能在创建它们的线程上访问。
@Dr4ketheb4dass我已经编辑了答案,您还可以为
getAll()
方法添加代码吗?我添加了getAll()方法,并进行了更改,但我仍然有相同的错误您从哪里得到该错误?有电话吗?您还可以共享与领域相关的代码吗?您需要在后台线程上打开领域,以便在后台线程上使用它(然后您还必须严格确保完成后它已正确关闭)
public Flowable<List<ClothingItem>> getClothingItemsRemote() {
    return clothingService.getAll("Bearer " + preferencesManager.getToken())         
            .subscribeOn(Schedulers.io())   
            .map(response -> response.items) 
            .observeOn(AndroidSchedulers.mainThread())
            .doOnSuccess(clothingItems -> {
                dbProvider.clearClothingItems();
                dbProvider.saveOrUpdateClothingItems(clothingItems);
            })     
            .observeOn(Schedulers.computation())
            .toFlowable()
            .map(remoteItems -> dbProvider.getClothingItems(mSortType));
}