Android комната загружает несколько данных одновременно, как узнать, что все запросы выполнены - PullRequest
0 голосов
/ 12 июня 2018

Итак, у меня есть Room база данных, и я использую MutableLiveData для загрузки four списков из базы данных на одном экране, каждый из этих четырех списков имеет отдельные callbacks, которые вызываются при загрузке данных, и у меня есть progress bar, которое я показываю, когда данные начинают загружаться, и я хочу скрыть это progress bar, когда загружены все четыре списка, но проблема в том, что обратные вызовы могут запускаться в случайное время только из-за всевозможных задержек, поэтому какие у меня есть варианты для расчетакогда все списки загружены?

1 Ответ

0 голосов
/ 15 июня 2018

Комната поддерживает RxJava.Вы можете возвращать потоки RxJava и комбинировать свои потоки с богатыми операторами RxJava.Проверьте список доступных в RxJava Wiki .

Вот непроверенный пример, чтобы дать вам представление о том, о чем я говорю

@Dao
public interface TodoDao {
    @Query("SELECT * FROM TodoList")
    public Observable<List<ToDoEntity>> getAllTodos();
}


@Dao
public interface AnotherListDao {
    @Query("SELECT * FROM AnotherList")
    public Observable<List<ToDoEntity>> getAllOtherList();
}


MyDatabase db = ...//get database instance here

//most of the times d is member class that is disposed before object of that class goes out of scope
Disposable d = Observable.merge(db.getAllTodos(), db.getAllOtherList())
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe(subscription -> {
                    subscription.request(Long.MAX_VALUE);

                    //data is loading
                })
                .subscribe(data -> {
                            //onNext
                            //work with data here
                        },
                        error -> {
                            //onError
                            //an erro happened here, service it
                        },
                        () -> {
                            //onComplete
                            //task is done
                        }
                );

//to avoid leaking the Observable dispose it in relevant lifecycle
if(d && d.isDisposable())
    d.dispose())

Дайте мне знать, если есть что-тоэто не ясно.

...