2013-02-17 8 views
9

Wiem, że podobne pytania były zadawane wielokrotnie. Myślę, że czytam większość z tego. Ale żadna odpowiedź nie ma zastosowania.Przekaż odwołanie do obiektu wewnątrz intencji bez implementacji Serializable lub Parcelable

Muszę przekazywać złożone obiekty przez intencje (wywołania/transmisje aktywności). Wszystko odbywa się w ramach mojego procesu. Dlatego nie widzę powodu, aby zapisywać moje obiekty w strumieniach, tylko po kilku milisekundach. Chcę przekazać referencję do obiektu poprzez moją aplikację. Czy jest jakikolwiek sposób to zrobić?

Ponieważ moja aplikacja będzie wielokrotnie transmitować to samo wydarzenie z rzędu, nie mogę polegać na elementach statycznych. Muszę uzyskać dokładnie ten sam obiekt dla tego, co nadałem.

Dlatego właśnie myślałem o statycznym "Referencyjnym", który zaakceptuje Obiekt i zwróci liczbę całkowitą, która identyfikuje ten obiekt na jego wewnętrznej liście, więc mogę przekazać tę liczbę całkowitą przez .putExtras. Ale o ile znam Javę, nie mogłem wyczyścić tego obiektu z tej listy po dodaniu go, ponieważ wielu Słuchaczy mogło być zainteresowanych tym samym obiektem i musiałbym go zatrzymać na zawsze w moim Rejestrze (zakładając, że wątek można wznowić w dowolnym momencie - nawet 2 minuty później).

Wszelkie pomysły? czy robię coś źle? Lub jakiekolwiek pomysły na to, jak mogę wyczyścić moje referneces (prawdopodobnie po kilku sekundach, może to doprowadzić do awarii, ale wydaje się, że jest to bardziej odpowiednie niż pisanie kodu, który montuje i ponownie składa moje obiekty bez powodu)

Odpowiedz

7

Twoje opcje są całkiem jasne: Nie ma sposobu, aby przekazać obiekt nie-marshallable (Parcelable, Serializable) w zamierzeniu. Kropka.

To, co możesz zrobić, to przekazać coś, co jest odniesieniem do obiektu niematerialnego. Chodzi o to, że zrobiłbyś coś w kolejności przekazywania klucza do mapy, która odwzorowuje ten klucz na wartość, którą chcesz przekazać. Jeśli zarówno nadawca, jak i zamierzony odbiorca mają dostęp do mapy, możesz przekazać odwołanie do obiektu niemonitorującego.

Nie rozumiem dokładnie, dlaczego uważasz, że statyczni członkowie nie są tym, czego chcesz. Przypuszczam, że mapa statyczna w niestandardowym obiekcie aplikacji byłaby dokładnie tym, czego potrzebujesz. ... i podejrzewam, z twojego komentarza na temat WeakHashMaps, że właśnie to odkryłeś.

... z tym wyjątkiem, że nic, co do tej pory nie powiedziałeś, nie wyjaśnia, dlaczego chcesz, aby Twoja mapa była słaba. Zanim użyjesz Słabej mapy, spójrz na Soft referencje, aby upewnić się, że to nie jest to, co masz na myśli.

Powodzenia

+0

Niektórzy ludzie polecili podobne pytania, aby użyć pola statycznego w obiekcie aplikacji do przekazania pożądanego obiektu. Tego właśnie nie chcę. Statyczna WeakHashMap jest totalna legit. Jeśli wszystkie referencje zostały usunięte, nigdy nie będę potrzebować obiektu, więc WeakRerence jest dokładnie tym, czego potrzebuję. – Chris

+0

@Chris Przepraszam, nie rozumiem, dlaczego nie można użyć zmiennej statycznej do ** przekazania odwołania do obiektu ** z jednego działania do drugiego. Nie ma niebezpieczeństwa wycieku pamięci tutaj, jeśli ActivityA robi "Globals.object = objectIWantToPass;", a następnie 'ActivityB.onCreate()' robi 'Object myObject = Globals.object; Globals.object = null; ' –

+2

Bo to okropne rozwiązanie. Jest to ten sam powód, dla którego przekazujesz obiekty przez odniesienie, a nie przez statyczny członek klasy. Uważam działanie za funkcję, która robi coś z danymi, które przekazuję, i które wrócą w pewnym momencie, a w niektórych przypadkach zwrócą dane z powrotem do osoby dzwoniącej. Ale wydaje się, że jest to jedyny sposób ... – Chris

4

EDIT:

Zapomnij o tym rozwiązaniu. To nie działa. Android radzi sobie z intencją, którą przekazujesz w .startActivity(). Nie ma sposobu, aby uzyskać jakiekolwiek odwołanie w działaniu. Jest to - moim zdaniem - świetne bu **** t my przez google. Musisz zadzwonić do swojej aktywności i umieścić referneces swojego obiektu w statycznych elementach ...

Tak jak zostało to opisane przez G. Blake Meike, nie ma sposobu na przekazywanie odniesień do obiektów w Androidzie za pośrednictwem Intents. Ale możesz użyć WeakReferences.

Bardzo doskonała aticle na ten temat można znaleźć tutaj: http://weblogs.java.net/blog/2006/05/04/understanding-weak-references

mam do tego roztworu przez to pytanie: Is it possible to get the object reference count?

Więc co mam zamiar zrobić w zasadzie jest: będę użyj Intents jako klucza do WeakHashMap i przekazuj mój obiekt jako wartość. Wydaje się, że jest to jedyny obiekt, który jest odpowiedni jako klucz, ponieważ wszystko, co umieścisz w dodatkach Intents, będzie serializowane. Z tego powodu można przekazać tylko jeden obiekt na cel. Możesz zaimplementować Subclasses wewnątrz Acitivity, które mogą pomieścić Twoje Obiekty i umieścić tę Subklasę na mapie. Ale nadal nie jestem pewien, czy obiekt Intent, który otrzyma odbiorca, jest taki sam, jak ten wywołujący, ale tak myślę. Jeśli tak nie jest, będę edytować to rozwiązanie (a może ktoś to wyjaśni).

+2

Nie jestem ekspertem od Androida, ale wątpię, aby działało 'WeakReference'. Wymóg "Serializable"/"Parcelable" * oznacza * że istnieje fundamentalne wymaganie, że obiekt jest głęboko kopiowany z jednego miejsca do drugiego. Oznacza to, że jakakolwiek forma przekazywania referencji nie będzie działać; na przykład ponieważ mówimy o różnych przestrzeniach adresowych pamięci. I nawet jeśli to działa, uzasadnieniem musi być to, że dzielenie się referencjami między wystąpieniami aplikacji jest złe z innych powodów. –

+0

Masz rację. Testowałem to. Intencja, którą otrzymuje działanie, nie jest tym samym, co ja. – Chris

+0

Czy mogę przekazywać odwołania do obiektu w intencji wysyłanej przy użyciu LocalBroadcastManager, jeśli pakuję ją w Paragon? – JohnyTex