Pracuję nad dość złożoną aplikacją na Androida, która wymaga dość dużej ilości danych o aplikacji (powiedziałbym, że łącznie około 500KB - czy to dużo jak na urządzenie mobilne?). Z tego co wiem, każda zmiana orientacji w aplikacji (a dokładniej w działaniu) powoduje całkowite zniszczenie i odtworzenie działania. Z moich ustaleń wynika, że klasa Application nie ma tego samego cyklu życia (tj. Jest zawsze tworzona dla wszystkich zamiarów i celów). Czy ma sens przechowywanie informacji o stanie wewnątrz klasy aplikacji, a następnie odwoływanie się do nich z działania, czy też generalnie nie jest to „akceptowalna” metoda ze względu na ograniczenia pamięci na urządzeniach mobilnych? Naprawdę doceniam każdą radę na ten temat. Dzięki!
112
Odpowiedzi:
Nie sądzę, aby 500 kB było aż tak wielkim problemem.
To, co opisałeś, to dokładnie sposób, w jaki poradziłem sobie z problemem utraty danych w działaniu. Utworzyłem globalny singleton w klasie Application i mogłem uzyskać do niego dostęp z działań, z których korzystałem.
Możesz przekazywać dane w Global Singleton, jeśli ma być często używany.
Następnie nazwij to w dowolnej czynności przez:
Omawiam to tutaj w moim poście na blogu , w sekcji „Global Singleton”.
źródło
Ci, którzy liczą na
Application
instancję, są w błędzie. Na początku może się wydawać, żeApplication
istnieje tak długo, jak istnieje cały proces aplikacji, ale jest to błędne założenie.System operacyjny może w razie potrzeby zabijać procesy. Wszystkie procesy są podzielone na 5 poziomów „kruchości” określonych w dok .
Na przykład, jeśli Twoja aplikacja działa w tle, ponieważ użytkownik odbiera połączenie przychodzące, to w zależności od stanu pamięci RAM system operacyjny może (lub nie) zabić proces (niszcząc
Application
instancję w procesie) .Myślę, że lepszym podejściem byłoby utrwalenie danych w pliku pamięci wewnętrznej, a następnie odczytanie go po wznowieniu działania.
AKTUALIZACJA:
Otrzymałem wiele negatywnych informacji zwrotnych, więc czas dodać wyjaśnienie. :) Cóż, początkowo naprawdę przyjąłem błędne założenie, że stan jest naprawdę ważny dla aplikacji. Jeśli jednak Twoja aplikacja jest w porządku, że czasami stan jest tracony (mogą to być niektóre obrazy, które zostaną ponownie odczytane / ponownie załadowane), to w pełni można zachować ją jako członka
Application
.źródło
Application
instancję, jednak nie będzie można liczyć na statyczne dane, chyba że je utrwalisz.Jeśli chcesz uzyskać dostęp do „Global Singleton” poza działaniem i nie chcesz przepuszczać
Context
wszystkich zaangażowanych obiektów w celu uzyskania singletona, możesz po prostu zdefiniować statyczny atrybut w swojej klasie aplikacji, który zawiera odniesienie do samo. Po prostu zainicjalizuj atrybut wonCreate()
metodzie.Na przykład:
Ponieważ podklasy
Application
również mogą uzyskiwać zasoby, można uzyskać do nich dostęp po zdefiniowaniu metody statycznej, która zwraca je, na przykład:Ale zachowaj ostrożność podczas przekazywania odwołań do kontekstu, aby uniknąć wycieków pamięci .
źródło
Application
. Aby to zrobić, możesz zadeklarować statyczną zmienną składową w dowolnej klasie .Dave, jakie to dane? Jeśli są to dane ogólne, które dotyczą aplikacji jako całości (przykład: dane użytkownika), rozszerz klasę Application i zapisz ją w niej. Jeśli dane dotyczą działania, należy użyć programów obsługi onSaveInstanceState i onRestoreInstanceState, aby zachować dane podczas obracania ekranu.
źródło
W rzeczywistości możesz zastąpić funkcję orientacji, aby upewnić się, że Twoja aktywność nie zostanie zniszczona i odtworzona. Spójrz tutaj .
źródło
Możesz utworzyć klasę Application i zapisać wszystkie swoje dane w tych plikach do użytku w dowolnym miejscu aplikacji.
źródło
Wiem, że jest to bardzo stare pytanie, ale użycie ViewModel z komponentów plecaka odrzutowego jest najlepszym sposobem na zachowanie danych między rotacją aktywności.
źródło