Android Recyclerview 在新线程中设置字段名称

Android Recyclerview set field name inside new thread

我想在 onBindViewHolder 方法中执行一个繁重的请求并将结果设置为 item filed。这就是我正在做的事情:

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    final RealmArticle obj = getItem(position);
    Realm realm = Realm.getDefaultInstance();
    holder.data = obj;
    holder.row_name.setText(obj.getTaskName());

    Maybe.fromCallable( ()->
            "Executed " +
                    realm.where(RealmArticle.class).findAll().where().equalTo("idTask", obj.getIdTask()).equalTo("completed", true).count() +
                    " from " +
                    realm.where(RealmArticle.class).findAll().where().equalTo("idTask", obj.getIdTask()).count())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe(res->{
                        holder.row_count.setText(res);
                        this.notifyItemChanged(position);
                        this.notifyDataSetChanged();
            },
                    throwable -> Log.e(TAG, String.format("%s, %s", "Can not get items count", throwable.getMessage())));
}

您可以看到我在一个新线程中执行大量请求,然后将结果设置到一个文件中。但它不能异步工作。 (但是当我在主线程中执行此请求时它会起作用)我做错了什么?

您正在使用 Maybe.just(),它会发出作为参数获取的项目,这意味着繁重的 Realm 请求甚至在 Maybe 开始之前就已解决并执行,结果是被 Maybe 用来构造一个 Maybe 来发射这个项目。
您需要使用的是 Maybe.fromCallable() 将重请求作为可调用方法,这将在订阅时解决,而不是立即如您所愿,并且将在后台线程中运行。

Maybe.just() 的另一个问题是它不能将 null 作为参数(因为 RxJava2 不允许 null),Maybe.fromCallable() 将 null 视为 Maybe 完成(不值)。

另外,为什么要立即调用 dispose()()?这将立即处理和取消订阅,这意味着如果你将使用 fromCallable(),并且你的 Maybe 将异步操作,你将永远不会得到答案(因为你告诉 Maybe 处理并停止收听事件之后你刚刚开始)