我正在使用翻新和Rxjava处理我的mvvm android应用程序的api调用。根据一些教程,我目前正在使用RxJava。
ViewModel.java
CompositeDisposable disposable = new CompositeDisposable();
private void fetchTodolist(){
loading.setValue(true);
disposable.add(
service.getToDoList("A1833")
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableSingleObserver<ApiResponse<ArrayList<TodoItem>>>() {
@Override
public void onSuccess(ApiResponse<ArrayList<TodoItem>> value) {
if(value.getStatus() == 200){
//on call success code
} else {
//on call rejected code
}
}
@Override
public void onError(Throwable e) {
// on call error code
}
})
);
}
现在我想将成功调用时api调用的结果缓存到会议室数据库中。所以我需要使用另一种异步方法,并尝试重用我之前创建的新线程。这是代码。
private void fetchTodolist(){
loading.setValue(true);
Scheduler a = Schedulers.newThread();
disposable.add(
service.getToDoList("A1833")
.subscribeOn(a)
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableSingleObserver<ApiResponse<ArrayList<TodoItem>>>() {
@Override
public void onSuccess(ApiResponse<ArrayList<TodoItem>> value) {
if(value.getStatus() == 200){
a.scheduleDirect(new Runnable() {
@Override
public void run() {
long inserted = dao.insert(value);
}
});
} else {
//on call rejected code
}
}
@Override
public void onError(Throwable e) {
// on call error code
}
})
);
}
我想知道这是否是不好的做法,是否会导致严重的问题。如果是这样,还有什么选择。
答案 0 :(得分:1)
Schedulers
使用缓存的引用,因此newThread()
返回相同的Scheduler
实例。
Schedulers.newThread() == Schedulers.newThread()
通常,应避免使用newThread
,因为它会为运算符的每个应用程序创建一个新线程。因此,如果您多次运行该序列,那么将创建并关闭新的工作线程,而不会进行任何重用。对于newThread().scheduleDirect
来说尤其如此,它将为该单个可运行对象启动一个新线程,然后将其停止。
建议您将Schedulers.io()
用于IO操作,以便以后尽可能多地重用那些底层工作线程。