MVP andoid и поворот экрана, использование ViewModel

100
06 января 2022, 12:40

Задался я вопросом как быть при повороте экрана, если ты используешь паттерн архитектуры MVP. Увидел много советов использовать для этого Moxy. Но у Google ведь есть прекрасный инструмент ViewModel LifeCycle, который живет, пока живет твоя активити. Собственно хочу задать вопрос, нормально ли например прикрепить к активити ViewModel, и передать ссылку на объект ViewModel в презентер? Далее через презентер сохранять в ViewModel данные, которые нужно сохранить при повороте экрана. В презентере проверять на наличие этих данных и соответственно возвращать из ViewModel LifeCycle сохраненые данные при повороте экрана. И не делать например сетевые запросы или обращение к базе данных в модели.

Приведу кусочек примера: ViewModel

public class VModel extends ViewModel
{
   private PhotoDay vmPhotoDay = null;       
    public PhotoDay getVmPhotoDay() {
        return vmPhotoDay;
    }
    public void setVmPhotoDay(PhotoDay vmPhotoDay) {
        this.vmPhotoDay = vmPhotoDay;
    }   
}
введите сюда код

В MainActivity

   public class MainActivity extends AppCompatActivity implements MainContract.IMainView {
        private MainContract.IMainPresenter iMainPresenter;
        private ImageView pDay;
        private ProgressBar progressBar;
        private VModel vModel;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            pDay = (ImageView)findViewById(R.id.photoDay);
            progressBar = (ProgressBar)findViewById(R.id.progressBar);
            vModel = ViewModelProviders.of(this).get(VModel.class);
            iMainPresenter = new MainPresenter(this, vModel);
            iMainPresenter.onShow();
        }
@Override
    public void showPhotoDay(PhotoDay photoDay) {
        Picasso.get()
               .load(photoDay.getUrl())
               .resize(300, 350)
               .into(pDay);
    }
    }

В презентере MainPresenter

public class MainPresenter implements MainContract.IMainPresenter {
    private MainContract.IMainView iMainView;
    private IModelDannie iModelDannie;    
    private VModel vModel;
    public MainPresenter(MainContract.IMainView iMainView, VModel vModel)
    {
        this.iMainView = iMainView;
        iModelDannie = new ModelDannie();
        this.vModel = vModel;
    }
    @Override
    public void onShow() {
        iMainView.showProgressBar();
        if(vModel.getVmPhotoDay()==null){
        iModelDannie.getPhotoDay().subscribe((PhotoDay photoDay)->
        {
            if(photoDay!=null) {
                iMainView.showPhotoDay(photoDay);
                vModel.setVmPhotoDay(photoDay);
            }else
            {
                iMainView.message(R.string.error_image);
            }
        });
        }else
        {
            iMainView.showPhotoDay(vModel.getVmPhotoDay());
        }
    }    
}

Можно ли так делать?

READ ALSO
break в Java выход из цикла

break в Java выход из цикла

Всем доброго времени! Данный код взят из книги Head First JavaПри выполнении данного кода получается вывод в консоль в виде :"6 14"

101
Эффект появления/затухания в Java fx

Эффект появления/затухания в Java fx

Не могу разобраться, какой bind нужно прикручивать к элементам Java FX, чтобы получить эффект появления затухания, влияя на него из Task()

120
Одинаковая высота flex-item в независимых flex-container

Одинаковая высота flex-item в независимых flex-container

Имеется вот такая конструкция:

97
Меню открывается и закрывается

Меню открывается и закрывается

Пытаюсь сделать двохуровневое адаптивное менюВроде что-то получилось, но есть проблема, когда первый раз нажимать на пункт меню, то оно открывается...

155