Udostępnianie obiektu między kartami (różne czynności)

Staram się znaleźć najlepsze rozwiązanie problemu: tworzę aplikację z 3 zakładkami. Otrzymuję dane xml z usługi odpoczynku i parsuję je do obiektu (jest tylko jedno żądanie). 3 zakładki wyświetlają teraz różne części tych danych. Myślałem o podzieleniu aplikacji na różne czynności, aby kod był bardziej czytelny. Jak podzielić datę między zajęciami? Wiem, że to pytanie zadano milion razy, ale nadal nie mogę znaleźć rozwiązania.

  1. obiekt aplikacji wymaga wywodzić się z klasy Application, ale moja główna aktywność jest już pochodną klasy TabActivity. użyć innej klasy głównej, a następnie uruchomić klasę kart z intencją?

  2. HashMapa słabych referencji do obiektów. Wydaje się, że to marnowanie pamięci, ale byłoby to możliwe.

  3. Umieść cały kod w jednym działaniu i skończ z tym.

Dzięki za wszelką pomoc :)


person Redfox    schedule 14.11.2011    source źródło
comment
Powinieneś wybrać odpowiedź, nawet jeśli jest to Twoja własna!   -  person AsTeR    schedule 15.11.2011
comment
Czekam na wygaśnięcie limitu czasu, aby móc wybrać odpowiedź. Używając twojego kodu otrzymuję błąd, że typ singleton jest nieznany. Eclipse nie może znaleźć żadnych importów dla tej klasy. Ale mimo wszystko dziękuję za twój wysiłek. (proszę przestać plenking [używanie zbędnych spacji przed znakami interpunkcyjnymi]) Wpadłem na pomysł, że po prostu nie wiedziałem, jak to zakodować. Niestety nie mogłem zrozumieć twojej sugestii.   -  person Redfox    schedule 16.11.2011
comment
Zapomniałem zastąpić kilka słów po skopiowaniu wklej, przepraszam, jeśli chcesz spróbować ponownie. Nadal uważam, że takie podejście jest najlepsze.   -  person AsTeR    schedule 17.11.2011


Odpowiedzi (5)


Idealnym rozwiązaniem jest to, że działanie powiadamia usługę, która uruchamia i obsługuje żądanie reszty, zapisuje wynik gdzieś, np. w sqlite-db, a następnie usługa powiadamia działanie, że transakcja została wykonana, aby mogła zapytać o dane.

Ale masz tylko jedną prośbę i nie sądzę, żebyś zawracał sobie głowę tymi wszystkimi wymienionymi powyżej, więc wybrałbym numer 3.

person josephus    schedule 14.11.2011
comment
tak, mam tendencję do zajmowania trzeciego miejsca ;) - person Redfox; 14.11.2011
comment
Różne działania skutkowałyby mniejszą ilością kodu na plik. Ale dowiem się, czy nadal jest w porządku w jednym zajęciu. - person Redfox; 14.11.2011
comment
Niewłaściwą rzeczą jest to, że dzielenie kodu, aby był bardziej wyraźny, jest dobrą rzeczą. Nie robienie tego jest brudne i leniwe ;) - person AsTeR; 14.11.2011

Dane:

import android.app.Application;
public class Data extends Application {

private int blupp = 0;

public void setBlupp(final int bla) {
    blupp = bla;
}

public int getBlupp() {
    return blupp;
}
}

Ustawienie danych w metodzie oncreate() jednego działania:

final Data myData = ((Data) getApplicationContext());
myData.setBlupp(12);

Pobranie go w metodzie oncreate() innego:

final Data myData = ((Data) getApplicationContext());
final int test = myData.getBlupp();

W manifeście Androida:

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:name="Data">

Należy tam umieścić dane klasy. To było dość proste. Formatowanie jest trochę pomieszane na tym forum. Nie do końca rozumiem to z formatem kodu. :( Dzięki za wszelką pomoc.

person Redfox    schedule 15.11.2011

We wszystkich moich aplikacjach używam klasy Context (wywoływanej przez Singleton), które przechowują wszystkie informacje i dane na poziomie aplikacji, które mają jakikolwiek powód do udostępniania w ramach różnych działań.

Nawiasem mówiąc, wprowadza to poziom modelu (w MVC sens tego) w twojej aplikacji, w projektowaniu oprogramowania ta część powinna być używana do przechowywania danych, które reprezentują dane użytkownika i stan aplikacji.

Przykład singletona :

public class AppContext {

    public String username = null;

    //////////////////
    // below the singleton implementation
    //////////////////

    private static final AppContext instance = new AppContext();

    // Private constructor prevents instantiation from other classes
    private AppContext() { }

    public static AppContext getInstance() {
        return instance;
    }
}

Kiedy otrzymałeś swoje dane z sieci (tu nazwa użytkownika):

AppContext.getInstance().username = receivedUsername;

Aby uzyskać go w jednym ze swoich działań:

myLabel.setText(AppContext.getInstance().username);

PS1 : rozszerzenie aplikacji w celu spełnienia takiego celu nie wydaje mi się dobrą rzeczą. Klasa Extending Application ma na celu rozszerzenie normalnego zachowania aplikacji, a nie sposób przechowywania wspólnych danych.

PS2 : Twoja słaba mapa odniesienia może zostać dodana w obiekcie Context w celu uporządkowania danych

person AsTeR    schedule 14.11.2011
comment
Singleton użyłby obiektu aplikacji? - person Redfox; 14.11.2011
comment
Nie ma jednej klasy, która została właśnie napisana, aby była dostępna wszędzie w Twojej aplikacji. Myślę, że dotknięcie obiektu aplikacji to zły pomysł na twój problem - person AsTeR; 14.11.2011
comment
Sprawdź na stronie wikipedii, jeśli nie wiesz, jak zrobić Singletona w javie. - person AsTeR; 14.11.2011
comment
Znam ideę singeltona, ale nie znam prawidłowego sposobu użycia go w Androidzie. Używam klasy aplikacji nie ma być środkiem do przechowywania wspólnych danych, to co to jest? :) - person Redfox; 14.11.2011
comment
Prawidłowym sposobem wykorzystania singletona jest po prostu dodanie do niego atrybutów (jest to podstawowy obiekt danych). Na przykład, jeśli otrzymasz nazwę użytkownika ze swojej usługi odpoczynku, po prostu: AppContext.getInstance().username = receiveUsername; pobrać go gdzie indziej AppContext.getInstance().username Czy to jest wystarczająco jasne? -› Zaktualizowałem swoją odpowiedź kodem - person AsTeR; 14.11.2011
comment
Bardzo dziękuję za nasz wysiłek. Wypróbuję to, gdy tylko wypróbuję to podejście: stackoverflow.com/questions/708012/ - person Redfox; 14.11.2011
comment
Ach tak, nie, rozumiem. Dzięki za wytrwałość. W ten sposób mogę usunąć wszystkie metody pobierające i ustawiające. To jest rzeczywiście lepsze podejście. Jeszcze raz dziękuję - person Redfox; 18.11.2011
comment
Ale używając tego podejścia bez pobierania i ustawiania, zmienne muszą być publiczne, co jest dość brzydkie. :( - person Redfox; 18.11.2011
comment
To zależy od tego, jak zamierzasz z niego korzystać. Porzucam podejście polegające na umieszczaniu wszędzie getter i setter. Eclipse Java oferuje dość łatwe rozwiązanie refaktoryzacji, gdy muszę coś gdzieś podłączyć, w tym przypadku klasa Context jest tylko podstawowym sposobem udostępniania danych wewnątrz aplikacji, w razie potrzeby można w niej umieścić metodę lub zaprojektować inną politykę dostępu do właściwości. - person AsTeR; 18.11.2011

Spróbuj stworzyć obiekt za pomocą

publiczny obiekt statyczny....

ten statyczny obiekt może być używany dla wszystkich twoich klas, możesz uzyskać dostęp do obiektu przez nazwęKlasy.NazwaObiektu

person Maulik J    schedule 14.11.2011

W zależności od danych można to zrobić na kilka sposobów. Jak duże są dane? Jeśli jest tylko tekstowy i nie jest szalenie duży, przechowywanie go w pamięci przez cały okres istnienia aplikacji może nie stanowić problemu.

Jeśli podzielisz swoją aplikację na różne czynności, masz dwie możliwości:

  • Przekazywanie danych pomiędzy aktywnościami jako zamierzone dodatki. Powiedzmy, że aktywność wyświetlana domyślnie pobiera dane. Jeśli chcesz zobaczyć inne części danych, możesz powiązać potrzebne dane z intencją i pobrać je w nowo utworzonej aktywności, używając getIntent().getExtras().
  • Przechowywanie danych w singletonie lub jako zmienna instancji podklasy Application. Odradzałbym używanie singletona, ponieważ posiadanie obiektów żyjących samodzielnie bez odniesień do innych obiektów sprawia, że ​​Twój kod jest bardziej podatny na wycieki pamięci. Przechowywanie danych w klasie Application jest moim zdaniem lepszym podejściem.

Jak już wspomniano, właściwe rozwiązanie zależy od tego, jak wyglądają Twoje dane. Jeśli wszystkie twoje działania wyświetlają różne części danych, prawdopodobnie zachowałbym je w mojej podklasie Application. Jeśli jednak Twoja aplikacja jest skonstruowana w podobny sposób jak lista kontaktów (jedno działanie do wyświetlenia kontaktów i jedno działanie do szczegółowych informacji o kontakcie), prawdopodobnie miałbym swoje dane w głównej czynności i przekazywałbym tylko niezbędne szczegóły do mojej innej działalności.

person Bendik    schedule 14.11.2011
comment
Dziękuję za odpowiedź. To w dużej mierze lista kontaktów. Osobista zakładka z kilkoma wartościami i dwiema listami zawierającymi kilkanaście wierszy po 3-4 wpisy każda. Ale wiele wartości do przeanalizowania z zamiarem, imho. Spróbuję utworzyć podklasę Application, która uruchamia moją podklasę TabActivity. - person Redfox; 14.11.2011