Это потому, что этот блок кода RxJava
выполняется asynchronously
, потому что вы подписываетесь на него в потоке IO , что означает поток, отличный от основного потока android, поэтому он не гарантирует, что код внутри doOnNext
выполняется перед кодом после вашей цепочки RxJava
. Я имею в виду порядок выполнения такой:
mListItems.clear(); // -> first this line gets executed
// Here and observable gets created and passed to another thread to get execute by that thread
compositeDisposable.add(Observable.create(handler)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(category -> {
mListItems.add(category);
notifyDataSetChanged(); // and at last this block of code gets executed
})
subscribe());
mListItems.forEach(this::expandAllParent); // -> secondly this line gets executed
если вы хотите правильно выполнить expandAllParent
для всех добавленных элементов, то лучше переместить эту строку кода в метод doOnNext
, например так:
mListItems.clear ();
compositeDisposable.add(Observable.create(handler)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(category -> {
mListItems.add(category);
notifyDataSetChanged();
mListItems.forEach(this::expandAllParent); // -> move this here
})
subscribe());