5

Zastanawiasz się, jaka jest lepsza praktyka przekazywania informacji między działaniami, dodawania ich do pakietu lub używania pojedynczej klasy do przechowywania i uzyskiwania dostępu do tych danych. Używałem obu w przeszłości dla różnych androidowych projektów pobocznych, ale teraz pracuję nad projektem androidowym, który ma znacznie większą skalę, więc wolałbym robić wszystko dobrze na początku.Android przekazuje trwałe informacje w pakietach lub używa wzorca singleton?

Moja aplikacja uwierzytelnia użytkowników, a następnie będzie musiała wykonać różne zapytania w oparciu o jej identyfikator. Aby zminimalizować sprzężenie między działaniami, myślę, że dodanie identyfikatora do pakietu, a następnie pozwolenie każdemu zapytaniu o aktywność dla potrzebnych informacji byłoby najlepszym rozwiązaniem; jednak w celu zwiększenia szybkości reakcji byłem skłonny do używania klasy singleton do przechowywania trwałych informacji, zapobiegając większej ilości zapytań, niż to konieczne.

Odpowiedz

7

Osobiście utworzę rozszerzenie Application, aby zapisać stan aplikacji i udostępnić dane między różnymi działaniami. Application działa jako kontekst dla całej aplikacji i gwarantuje Androida, że ​​zawsze będzie tylko jedna instancja w całej aplikacji. W związku z tym działa podobnie do definiowania własnego Singleton, ale użycie Application pozwoli Androidowi przejąć kontrolę nad cyklem życia udostępnianych danych i zasadniczo zarządzać pamięcią za Ciebie.

Here are some more details. Jeśli przejdziesz tę ścieżkę, możesz po prostu dodać do rozszerzenia aplikacji dowolną metodę pobierającą/ustawiającą (lub inną), aby przechowywać/pobierać dane i wykonywać na nich operacje. Szczególnie ten drugi może stać się dość trudny do zarządzania (i zachowania spójności) podczas przechodzenia między czynnościami. Jeśli używałby tylko Bundle, jeśli dane są potrzebne w jednym lub dwóch miejscach, które są sąsiadami w przepływie czynności, to nie trzeba wykonywać na nich żadnych (złożonych) operacji.

+0

Dzięki, MH, zdecydowanie wydaje się być drogą do pokonania –

+0

Niestety, nie zaznaczyłem tej odpowiedzi jako poprawnej odpowiedzi wcześniej! –

+1

Wszelkie sugestie dotyczące przywrócenia stanu tej trwałej informacji, gdy aplikacja jest zabity/zrestartowany? Nie ma wywołań zwrotnych, aby zapisać te dane, więc jedyną rzeczą, o której mogłem pomyśleć było zapisanie go do SharedPreference. –

0

Przekazywanie pakietów to żmudna praca. Będziesz musiał przekazać pakiet dla każdej zmiany w działaniu, aby upewnić się, że wartość nie zostanie utracona, nawet jeśli nie używasz wartości w wywołanym działaniu.

1

Jedynym momentem, w którym przekazuję dane między działaniami za pośrednictwem programu bunlde, jest sytuacja, w której nie będę potrzebował dostępu przez jakiś czas (tj. Identyfikator residu zasobu, który chcę użyć tylko raz w działaniu wywołującym, itp.) . Sądzę też, że różnica w szybkości reakcji byłaby bardzo minimalna, więc nie powinno to budzić obaw. Proponuję podejście singletonowe

1

Lepszym rozwiązaniem jest użycie SharedPreferences w celu zachowania userId, które należy zachować i używać ponownie. Oczywiście możesz użyć podejścia singleton lub nawet klasy Application, ale dane zostaną utracone po zabiciu aplikacji.

0

Wzór Singleton ma pewne złe wyniki. Na przykład: Z głównej aktywności wywołujesz aktywność drugorzędną. Rozmowa telefoniczna przerwała twoją pracę. Po zakończeniu rozmowy telefonicznej Android próbuje przenieść dodatkową aktywność na ekran. Oto mój koszmar - wielu użytkowników skarży się na wyjątki - Google zgłosił mi NULL wskaźniki w moim singleton. Tak więc musisz podać nie tylko singleton, ale wszystkie dane w singletonie muszą być również singletonowe. To się stało bardzo skomplikowane :(