Po pierwsze, wiem, że z Prezenterem widoku modelu istnieją różne implementacje, i w moim umyśle, o ile jasno zdefiniowano warstwy abstrakcji i ich wyznaczone role, to w jaki sposób wdrożenie tego wzoru jest otwarte na interpretację. Wdrażałem ten wzorzec w kilku aplikacjach, w których był tylko jeden Activity
. Teraz rozpocząłem nowy projekt, który ma wiele działań i dołączony Fragments
, w tym fragmenty zagnieżdżone (ViewPager
).Wiele czynności/fragmentów i wzorzec prezentera Model Viewer
Próbuję teraz przetłumaczyć MVP na ten projekt i uderzyłem w ścianę koncepcyjną.
tej pory stworzyłem powyższej struktury i zaczął robić 1: 1 związek z widokiem & Presenter (niezależnie od Activity
lub Fragment
). Czuję, że to jest w porządku, ale jeśli na przykład wysłałem prośbę o zrobienie czegoś z widoku Activity
View to the Presenter, który zwraca wynik do Activity
Zobacz, w jaki sposób chciałbym propagować wynik, tj. Zaktualizować wszystkie inne działania/fragmenty które obecnie nie są w stanie Paused()
lub Stop()
. Mam wrażenie, że w tym przypadku powinien istnieć centralny prezenter, który aktualizuje wszystkie niezbędne widoki aktywności i fragmentów, ale nie jestem pewien, jak to zrobić.
Obecnie, gdy każdy Activity
i Fragment
jest tworzony tworzy nową instancję klasy Presenter, przekazując sobie jako punkt odniesienia (działalności i fragmenty realizacji własnych interfejsów), który przechowuje prezentera jako WeakReference
i może powoływać się na odpowiednie metody interfejsu podczas zwracania wyniku.
Zgodnie z dokumentami zawsze, gdy Fragments
chce się komunikować ze sobą i z dołączonym Activity
, należy użyć interfejsu wywołania zwrotnego. Mając to na uwadze, powinienem mieć jeden interfejs wywołania zwrotnego, który implementuje Activity i wywołanie zwrotne od Fragments
, gdy tylko o coś poprosi, więc zasadniczo tylko działanie będzie miało warstwę Presenter i Model, do której Fragmenty będą musiały się oddzwaniać w celu wykonania różnych żądań. ?
Przepraszam, jeśli to brzmi trochę pomieszany, mam nadzieję, że jest to wystarczająco jasne, aby zrozumieć, co chcę osiągnąć, i jeśli myślę wzdłuż właściwych linii ... lub zupełnie nie pasuje!
Dziękuję za komentarze i przemyślenia. Myślę, że po prostu użyję Presentera z Działalnością i pozwolę sobie na aktualizację fragmentów. Pamięć przecieka z Singletonem? Stałoby się tak tylko wtedy, gdyby Singleton miał odniesienie do działania lub fragmentu (w zasadzie coś z cyklem życia, który może nadejść i odejść)? Jeśli tak, używam singletonu na coś innego, ale nie ma żadnych odniesień. Używam 'WeakReferences' z Działaniami i Fragmentami (cokolwiek z odwołaniami cyklu życia), ponieważ nie muszę' null' Silne referencje dotyczące zmian konfiguracji, a 'WeakReference' zezwala na GC –
Jeśli twój prezenter nie jest singletonem, to nie powinieneś. • Masz problem ze zmianami konfiguracji, ponieważ sam prezenter również zostanie odtworzony. Możesz potrzebować 'WeakReference' jeśli użyjesz zatrzymanego fragmentu chociaż. W każdym razie wydaje się, że wyraźnie rozumiesz, jak słabe referencje działają, więc nie muszę tego wyjaśniać. Dziękuję. –
Żaden prezenter nie jest singletonem, Po utworzeniu prezentera przechowuję jego odwołanie w 'HashMap' wewnątrz bezgłowego zatrzymanego fragmentu i odzyskuję jego odniesienie do zmian konfiguracji za pomocą działania. ... Kiedy wydaje mi się, że rozumiem coś na Jawie, wydaje mi się, że zawsze rzucał mi krzywą piłkę! Dzięki za radę. –