1

Тема: Oдна viewmodel дві activity

У мене є activity_1 та viewmodel до неї, у цій viewmodel відкриваю soket та налаштовую з'єднання. У activity_1 я використовую дані прийняті через це з'єднання, а також через  activity_1 я переходжу в activity_2 . У activity_2 я також хочу використовувати з'єднання яке налаштоване  у viewmodel . Питання: як зробити щоб  activity_1   та  activity_2 спільно використовували viewmodel . Буду вдячний за будь-які поради в реалізації. Дякую!

2

Re: Oдна viewmodel дві activity

Якщо питання у спільному використанні одного екземпляра ViewModel кількома  екземплярами Activity, то можемо використати механізм, як для Activity та Fragment в темі

Відміність лише в тому, що в цьому випадку, з двома екземплярами Activity , ми генеруємо дані, на які оба екземпляра Activity будуть підписані, безпосередньо в екземплярі ViewModel. Інформація буде доступна як activity_1, так і activity_2 , коли ті будуть знаходитись в foreground, і відповідно присутніми в списку спостерігачів(observers) у LiveData, куди зберігаються прийняті з мережі дані.

Подякували: andriesko1

3

Re: Oдна viewmodel дві activity

Тобто, мені треба при створені activity_2 передати через об'єкт Bundle екземпляр  ViewModel щоб був один і той самий об'єкт підключення?

4

Re: Oдна viewmodel дві activity

На жаль, ні варіант, що я описав, з попередньої теми, ні варіант через Bundle на даний час не спрацює.
За цим посиланням видно, що питання розшарення одного екземпляра ViewModel для різних Activity, Google ще не вирішував: https://issuetracker.google.com/issues/64988610 .А цьому питанню вже 18 місяців.
Як варіант, пропонується певне вирішення тут: https://github.com/googlesamples/androi … -407291032. Але, як на мене, я б краще виніс мережеві операції в репозиторій, наприклад, клас HttpRepository (який створюється в одному екземплярі), зі своїм LiveData, як це і рекомендує Google. Для кожного екземпляра Activity створив свій екземпляр ViewModel, і підключився до LiveData репозиторію як спостерігач(observer). Таким чином, екземпляри ViewModel обох Activity отримуватимуть дані паралельно.

Подякували: leofun01, andriesko2

5

Re: Oдна viewmodel дві activity

До речі. Судячи з Google I/O 2018, Google активно буде просувати архітектурний компонент Navigation https://developer.android.com/topic/lib … avigation/. На сьогодні, Google не рекомендує використовувати Activity для Master/Detail, а користуватись Fragment і, відповідно, Navigation. Тому навряд чи буде вирішувати питання спільного використання ViewModel для кількох Activity, оскільки для Fragments під одним Activity механізм відпрацьований.

Подякували: andriesko1

6

Re: Oдна viewmodel дві activity

А яким чином можна із ViewModel підписатись на зміни в репозиторію? Щось я їхньої інструкції не зовсім розумію.. https://developer.android.com/jetpack/d … d-app-arch
Як при появі нових даних із сервера метод init() "відсвіжить" дані?

7 Востаннє редагувалося PRY (07.02.2019 09:37:48)

Re: Oдна viewmodel дві activity

andriesko написав:

А яким чином можна із ViewModel підписатись на зміни в репозиторію? Щось я їхньої інструкції не зовсім розумію.. https://developer.android.com/jetpack/d … d-app-arch
Як при появі нових даних із сервера метод init() "відсвіжить" дані?

Це посилання на самий початок пояснення взаємодії ViewModel з іншими архітектурними компонентами Android.
Тобто тут йдеться про те, як не потрібно робити.
Більш конкретно взаємодія ViewModel з Repository наведена трішки далі, на цій же сторінці.
https://developer.android.com/jetpack/d … repository
Ідея в тому, щоб об'єкт LiveData, що належить Repository (отриманий в ViewModel через виклик repository.getUser()) передати в Activity (при виклику з Activity viewModel.getUser()). Тоді Activity "посадить" на нього свій Observer і буде спостерігати за LiveDate, що створений в Repository, а не за тим LiveDate, що створений в ViewModel. Це у випадку, якщо формат даних, що передаються з Repository, влаштовують UI сторону.
Якщо ні, можна, як варіант, зробити це в два етапи: виконати проміжну обробку даних в ViewModel, "посадивши" в ViewModel Observer на LiveData з Repository так само, як це робить Activity для LiveDate з ViewModel, але використавши метод observeForever(Observer<T> observer). В методі onChange() цього обсервера дані можна обробити належним чином (наприклад, привести до вигляду, що відповідають вимозі UI) і викликати setValue() на об'єкті LiveData, який належить ViewModel та спостерігається з Activity.

Подякували: andriesko1