RxJava. Как в Observable вывести progressDialog?

466
08 июля 2017, 08:32

У меня есть метод для примера, мне нужно во время получения запроса вывести progressDialog, в onCompleted() - dismiss в onNext show, но по итогу на экран progressDialog не выводится. В чем может быть причина, скорее всего я чего-то недопонимаю?

public void newsGetRxEnd(RecyclerView mRecyclerView, Context context) {
          progressDialog = new ProgressDialog(context, R.style.MyTheme);
          progressDialog.setCancelable(false);
          progressDialog.setProgressStyle(android.R.style.Widget_ProgressBar_Small);
    Link link = retrofit.create(Link.class);
        Observable<List<News>> observable = link.endNews(db.getMin("news", "idNews"));
        observable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<List<News>>() {
                    @Override
                    public void onCompleted() {
                        Log.d(LOG_TAG, "onCompleted");
                        progressDialog.dismiss();
                    }
                    @Override
                    public void onError(Throwable e) {
                        Log.d(LOG_TAG, "onError " + e);
                    }
                    @Override
                    public void onNext(List<News> newses) {
                        Log.d(LOG_TAG, "onNext " + newses.size());

                        for (int i = 0; i < newses.size(); i++) {
                            db.addRec(newses.get(i).getTitle(), newses.get(i).getId(), newses.get(i).getSummary(),
                                    String.valueOf(newses.get(i).getNewsDate()));
                            Log.d(LOG_TAG, "db.getNewsList().size(): " + db.getNewsList().size());
                        }
                        mRecyclerView.getAdapter().notifyDataSetChanged();
                     progressDialog.show();
                    }
                });
    }
Answer 1

Скорее всего диалог с прогрессом просто не успевает показаться.

У вас сейчас так:

  1. Идёт загрузка из сети в фоновом потоке
  2. По её завершении в основном потоке идёт запись в БД
  3. После записи показывается диалог.
  4. Сразу после этого вызывается onCompleted() и диалог скрывается.

Т.к. скорее всего меж п3 и п4 проходит всего несколько миллисекунд то диалог просто не успевает отобразиться.

Могу предложить несколько вариантов.

  1. Показывать диалог при старте запроса в сеть.
  2. Показывать диалог перед записью в БД. Если она занимает значимое время, то диалог успеет показаться. Но тут момент в том, что писать в БД лучше таки тоже в фоновом потоке, а не в основном, т.к. интерфейс заморозиться и вообще может ANR возникнуть.

В обоих случаях вам надо обрабатывать ошибки и скрывать диалог в onError.

И надо помнить, что если вы будете запись в БД делать в фоновом потоке и перед оной показывать диалог, то обращения к нему надо делать (как и ко всему остальному UI) в основном потоке.

READ ALSO
Записать версию в переменную

Записать версию в переменную

Подскажите код, который бы получал содержимое файла (versiontxt), который находится по ссылке http://localhost/version

327
Как после выполнения return метод продолжает работать?

Как после выполнения return метод продолжает работать?

Есть метод который ходит в DB и вытаскивает клиента из таблицыПроисходит странная аномалия, в дебагере после прохождения строки return result; метод...

257
Кодировка eclipse + mySQL

Кодировка eclipse + mySQL

Добрый деньТакая ситуация, есть проект web app, пишу на java + glassfish, есть база данных mySQL в ней данные, настроил подключение между glassfish и mySQL, делаю...

402
В чем отличие условных выражений в Scala от Java?

В чем отличие условных выражений в Scala от Java?

Прохожу курс на CourseraТам объясняются условные выражения

396