2010-11-17 10 views
6

Jestem całkiem nowy w programowaniu w systemie Android/Java, więc niektóre z podstawowych rzeczy wciąż są dość mylące. Tak więc, powiedzmy, że moja aplikacja pobiera wszystkie dane (artykuły), których wymaga od zewnętrznych plików XML, analizuje je do modeli danych (klasa artykułów) i te artykuły będą używane (wyświetlanie na listach lub w jednym artykule) w całej aplikacji dla wszystkich jej koło życia.Gdzie należy globalnie przechowywać/buforować dane potrzebne do całego cyklu życia aplikacji?

Gdzie powinienem je przechowywać? Czy mogę utworzyć klasę singleton z tablicą zawierającą wszystkie artykuły, które analizowałem? Czy powinienem zapisać je w bazie danych, a następnie zapytać na żądanie? (brzmi to jak zbyt dużo pracy, nie muszę ich teraz buforować) Jaka jest najlepsza praktyka?

Odpowiedz

2

Zachowaj je w Application. Jest to klasa podstawowa dowolnej aplikacji na Androida i jest ona aktywna przez cały okres użytkowania aplikacji, podczas gdy Aktywności są zabijane, gdy nie są pokazywane lub orientacja jest zmieniana.

Musisz zadeklarować android:name w AndroidManifest.xml:

<application android:name=".YourApplication"/> 

Zmieniano:

Jest to również istotne: How do I pass data between Activities/Services within a single application?

+0

Czy to nie sprawi, że główna klasa będzie zbyt zagracona? Zwłaszcza, jeśli będę przechowywać więcej danych (tablic) w nim i metod dedykowanych do zarządzania (dodawania, zmiany, wyszukiwania) tych danych. – sniurkst

+0

To jest twoja decyzja projektowa. Mówię tylko, że aplikacja jest dostępna dla wszystkich działań i jest właściwym miejscem do przechowywania udostępnionych danych, które są powiązane z cyklem życia aplikacji, a nie cyklem życia aktywności. –

+0

Możesz umieścić dane bezpośrednio w aplikacji lub możesz umieścić je w specjalistycznej klasie i odnieść się do niego w aplikacji. –

1

to zależy jaki jest Twój styl programowania lol.

możesz, jak powiedziałeś, stworzyć singleton, który przeczyta twój xml i zapisze wszystko.

możesz utworzyć statyczny hasz w swojej klasie. w ten sposób podczas tworzenia nowego obiektu będziesz miał dostęp do statycznych informacji z tej klasy.

możesz przekazać informacje z klasy do klasy jako parametry.

Jeśli chcesz, abyśmy powiedzieli ci, która z nich będzie najlepsza, będzie to trudne bez znajomości architektury Twojego programu.

na przykład można mieć kontroler widoku, który obsługuje wszelkie zmiany, a następnie łatwo jest przechowywać dane na tym poziomie, aby je przekazać po zmianie widoku.

możesz mieć statyczne widoki, w których możesz bezpośrednio ustawić wszystkie wartości podczas ich otwierania.

Mogłeś mieć słabo połączone widoki, które nawzajem się łączą, bez żadnego kontrolera do obsługi przełączania iw takim przypadku może wolisz mieć sposób na zebranie potrzebnych informacji z singletonu lub metody statycznej ...

+0

Idealnie, chciałbym mieć klasę, która: byłaby dostępna dla wszystkich działań, przechowywałaby tablicę obiektów i byłaby w stanie zarządzać tą tablicą (dodawać więcej obiektów, zdobywać obiekt według jego pozycji w tablicy lub jakiegoś rodzaju własności), jeśli to sprawia, że ​​moje pytanie jest bardziej jasne. – sniurkst

0

Dopóki upewnisz się, że nie masz żadnych wątków działających na udostępnionych danych, możesz po prostu utworzyć statyczną klasę ze statycznymi członkami. każde działanie będzie mogło uzyskać do niego dostęp. Jeśli korzystasz z asynchronicznego pobierania twoich danych, to w onPostExecute twojego handlera możesz dotknąć GlobeVars, ponieważ działa on w wątku UI.

public class GlobalVars { 
    public static String userId = "?"; 
    //public static String serverUrl = "10.0.2.2"; //localhost when developing 
    public static String serverUrl = "192.168.1.4"; //on device to laptop 
    //public static String serverUrl = "102.192.293.10"; //production 
    public static Book currentBook = null; 
    public static Chapter currentChapter = null; 
    public static int lastclickedChapter = -1; 
    public static Voice currentVoice = null; 
    public static String catalogJson = ""; 
    public static ArrayList<Book> catalogItems = null; 
} 

onCreate stanowi główną działalność mogę ustawić katalog do pobranego listy xml coverted do obiektów

GlobeVars.catalogItems = downloaded xml to object list 

w moim Poddziałanie który znajduje się lista rozdziałów w onclicklistener mogę ustawić:

GlobeVars.currentChapter = items[clickeditem]; 

po powrocie do głównej aktywności wartości nadal będą ustawione.

Powiązane problemy