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 处理并停止收听事件之后你刚刚开始)
我想在 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 处理并停止收听事件之后你刚刚开始)