Przesyłanie własnego obiektu między Aktywnościami w Androidzie
Ostatnio opisywałem na blogu w jaki sposób możemy przesyłać dowolne dane między aktywnościami w Androidzie. W artykule tym zaznaczyłem jednak, że mechanizm ten działa tylko dla określonych typów obiektów. W większości przypadków jest to w zupełności wystarczające, co jednak jeśli nasza aplikacja wykorzystuje do swojego działania sporo różnych informacji? Raczej w takim przypadku kiepskim pomysłem będzie dodawanie x
pól i przesyłanie ich pojedynczo, skoro można to ładnie opakować w jedną klasę i tylko ją przesłać. Problem w tym, że opisywany mechanizm przesłania danych między poszczególnymi oknami w aplikacji nie umożliwia nam wysłania własnego obiektu. Oczywiście można to w prosty sposób ominąć, zobaczmy więc jak…
Parsowanie
Cała sztuczka opiera się na jednej prostej zasadzie, każdy obiekt jaki utworzymy w naszej aplikacji mobilnej możemy sparsować do formatu tekstowego, a następnie z powrotem do postaci pierwotnej. Jak pewnie się domyślacie, obiekty typu String
można przesyłać między aktywnościami bez większego problemu. Pewnym kłopotem może więc być sparsowanie naszej klasy do postaci tekstowej ale tutaj z pomocą przychodzą nam odpowiednie biblioteki.
Gson
Gson jest opensource’ową biblioteką stworzoną przez programistów Google, która umożliwia nam parsowanie dowolnego obiektu w Javie do postaci tekstowej – json’a oraz z json’a do postaci pierwotnej. Jak nie trudno się domyślić, to załatwi nam całą sprawę z przysłaniem danych między aktywnościami.
Aby wykorzystać bibliotekę Gson w naszym projekcie najpierw należy ją zaimportować. W tym celu przechodzimy do głównego menu w Android Studio i wybieramy opcję „Build” oraz z rozwijanej listy „Edit Libraries and Dependencies…„:
Następnie przechodzimy do zakładki „Dependencies” oraz klikamy na „plusa” znajdującego się w lewym dolnym rogu okna:
Z rozwiniętej listy wybieramy „Library dependency„:
Następnie wpisujemy w wyszukiwarkę frazę „gson„:
Odnajdujemy odpowiednią pozycję na liście („com.google.code.gson:gson:x.x„) i klikamy przycisk „OK„. Biblioteka Gson zostanie automatycznie dołączona do projektu:
Teraz wracamy z powrotem do naszego projektu, klikając przycisk „OK„.
Przesyłanie danych
Załóżmy, że mamy klasę o nazwie na przykład: GameData
. Jest to obiekt, który stworzyliśmy na potrzeby naszej aplikacji i przechowujemy w nim jakieś dane, z których korzysta nasz program. Aby przesłać ten obiekt do drugiej aktywności musimy go sparsować do postaci tekstowej czyli json’a. Zrobimy to tak:
String json = new Gson().toJson(gameData);
Jako argument statycznej metody toJson()
obiektu Gson()
podajemy obiekt naszej klasy (GameData
): gameData
(GameData gameData = new GameData()). Wszystko to zapisujemy do zmiennej typu String, którą następnie przesyłamy do nowej aktywności, metodą opisaną w artykule „Przesyłanie danych między Aktywnościami w Androidzie„:
String json = new Gson().toJson(gameData); Intent i = new Intent(this, SecondActivity.class); i.putExtra("name", json); startActivity(i);
Odczyt danych
Przesłaną klasę w formacie tekstowym odczytujemy w normalny sposób (podany w artykule „Przesyłanie danych między Aktywnościami w Androidzie„):
String name = getIntent().getStringExtra("name");
My jednak potrzebujemy z powrotem nasz obiekt, więc musimy ponownie sparsować tym razem json’a do postaci pierwotnej czyli naszej klasy. W tym celu wykorzystamy metodę fromJson()
, gdzie jako pierwszy argument podajemy zmienną w której zapisaliśmy json’a, a jako drugi argument naszą klasę w formacie: NazwaKlasy.class
:
GameData gameData = new Gson().fromJson(name, GameData.class);
Nasz obiekt jest już dostępny w kolejnej aktywności. Możemy bez problemu skorzystać ze wszystkich jego właściwości.
Mały błąd w artykule.
Przy przesłaniu obiektu z jednej aktywności do drugiej aktywności poniższy fragment kodu:
String json = new Gson().toJson(GameData.class);
Nie zadziała. Zamiast GameData.class trzeba wpisać nazwę zmiennej obiektowej która używa tej klasy.
Faktycznie, to co napisałem nawet nie ma sensu. Dzięki za uwagę ;) Poprawię to jak tylko będę miał dostęp do komputera.
Jest to dosyć dobra inicjatywa bo nie wymaga przesyłania całego kodu w pojedynczych klasach a jedynie jednej klasy która jest opakowana w to. z kursów na androida to na eduweb.pl są dosyć spoko opisane.
A jak zapisać te nowe dane w teh drugiej aktywności aby były dostępne w pierwszej aktywności?
Chcesz zapisać dane z pierwszej aktywności w drugiej? Masz do nich normalnie dostęp z poziomu zmiennych więc możesz robić co chcesz.
Dziękuję, ależ to ułatwienie :)