arraylist не обновляется вне метода onNext - PullRequest
0 голосов
/ 05 июня 2019

ArrayList обновляется в onNext, но вне него ArrayList не обновляется.

    mListItems.clear(); //size = 0

    compositeDisposable.add(Observable.create(handler)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnNext(category -> {
                mListItems.add(category); //size = 3
                notifyDataSetChanged();
            })
            .subscribe());

    mListItems.forEach(this::expandAllParent); //size = 0

1 Ответ

0 голосов
/ 05 июня 2019

Это потому, что этот блок кода 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());
...