Android RxJava Повторное использование темы, это плохая практика? - PullRequest
0 голосов
/ 16 октября 2019

Я использую модификацию и Rxjava для обработки вызовов API для моего приложения mvvm android. Основываясь на некоторых уроках, в настоящее время я использую 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 Ответ

1 голос
/ 16 октября 2019

Schedulers использует кэшированные ссылки, поэтому newThread() возвращает тот же экземпляр Scheduler.

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

Как правило, следует избегать использования newThread, поскольку он создает новый поток для каждого приложения оператора. ,Таким образом, если вы запускаете последовательность несколько раз, новые рабочие потоки создаются и удаляются без какого-либо повторного использования. Это особенно верно для newThread().scheduleDirect, который запустит новый поток только для этого единственного запускаемого объекта и впоследствии остановит его.

Рекомендуется использовать Schedulers.io() для операций ввода-вывода, чтобы эти рабочие потоки использовались каккак можно позже.

...