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操作,以便以后尽可能多地重用那些底层工作线程。