Android RxJava线程重用,这是不好的做法吗?

时间:2019-10-16 04:30:23

标签: android multithreading rx-java2 android-mvvm

我正在使用翻新和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
                    }
                })
        );
    }

我想知道这是否是不好的做法,是否会导致严重的问题。如果是这样,还有什么选择。

1 个答案:

答案 0 :(得分:1)

Schedulers使用缓存的引用,因此newThread()返回相同的Scheduler实例。

Schedulers.newThread() == Schedulers.newThread()

通常,应避免使用newThread,因为它会为运算符的每个应用程序创建一个新线程。因此,如果您多次运行该序列,那么将创建并关闭新的工作线程,而不会进行任何重用。对于newThread().scheduleDirect来说尤其如此,它将为该单个可运行对象启动一个新线程,然后将其停止。

建议您将Schedulers.io()用于IO操作,以便以后尽可能多地重用那些底层工作线程。