Android RxJava 线程重用,这是一种不好的做法吗?
Android RxJava Thread Reusal, Is it a bad practice?
我正在使用改造和 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
}
})
);
}
我想知道这是不是一种不好的做法,会不会导致严重的问题。如果是这样,还有什么选择。
Schedulers
使用缓存引用,因此 newThread()
returns 相同的 Scheduler
实例。
Schedulers.newThread() == Schedulers.newThread()
通常您应该避免使用newThread
,因为它会为操作员的每个应用程序创建一个新线程。因此,如果您多次 运行 序列,则会创建和解雇新的工作线程,而不会进行任何形式的重用。对于 newThread().scheduleDirect
尤其如此,它将仅为该单个 运行nable 启动一个新线程,然后停止它。
建议您使用Schedulers.io()
进行IO操作,以便以后尽可能多地重用那些底层工作线程。
我正在使用改造和 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
}
})
);
}
我想知道这是不是一种不好的做法,会不会导致严重的问题。如果是这样,还有什么选择。
Schedulers
使用缓存引用,因此 newThread()
returns 相同的 Scheduler
实例。
Schedulers.newThread() == Schedulers.newThread()
通常您应该避免使用newThread
,因为它会为操作员的每个应用程序创建一个新线程。因此,如果您多次 运行 序列,则会创建和解雇新的工作线程,而不会进行任何形式的重用。对于 newThread().scheduleDirect
尤其如此,它将仅为该单个 运行nable 启动一个新线程,然后停止它。
建议您使用Schedulers.io()
进行IO操作,以便以后尽可能多地重用那些底层工作线程。