Опубликовать несколько MutableLiveData не имеют порядка - PullRequest
0 голосов
/ 10 октября 2019

Я использую несколько MutableLiveData для архитектуры MVVM. на ViewModel я публикую объекты, но фрагмент не возобновляется. когда фрагмент возобновлен, наблюдатели получают MutableLiveData, но не в том порядке, в котором я их публикую. Как я могу форсировать порядок получения MutableLiveData?

ViewModel:

void foo(){

first_MutableLiveData.post(newData)

second_MutableLiveData.post(newData)

}

фрагмент:

initView(){

first_MutableLiveData.observe(this,()->{
"getting called second"})

second_MutableLiveData.observe(this,()->{
"getting called first"})

}

Ответы [ 2 ]

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

Вы не можете заставить то, что хотите. Как вы можете видеть из кода, они публикуют результат в MainThread, вызывая:

ArchTaskExecutor.getInstance()  

Так что теперь можно было бы поддерживать синхронизацию между двумя различными объектами LiveData. Это ваша работа, сделайте это. Это угловой случай.

Просто используйте setValue вместо postValue непосредственно в MainThread. Вот пример.

открытый класс MainThreadExecutor реализует Executor {

    private final Handler handler = new Handler(Looper.getMainLooper());

    @Override
    public void execute(Runnable runnable) {
        handler.post(runnable);
    }
}

public class YourClass {

    MutableLiveData first_MutableLiveData = new MutableLiveData<Data>();
    MutableLiveData second_MutableLiveData = new MutableLiveData<Data>();


    private final Executor executor;

    public YourClass(Executor executor) {
        this.executor = executor;
    }


    void foo(){

        executor.execute(new Runnable(){
            @Override
            public void run() {
                first_MutableLiveData.setValue(newData);
                second_MutableLiveData.setValue(newData);
            }
        });

    }

}
0 голосов
/ 10 октября 2019

Так что, очевидно, когда я изменил порядок наблюдателя на фрагменте, они прибыли в том порядке, в котором я был им нужен. Спасибо всем за быстрый ответ!

...