2012-12-02 6 views
6

Pracuję nad projektem Android, w którym muszę załadować niektóre obrazy do GridView. Obrazy mogą znajdować się w pamięci podręcznej, jeśli brakuje pamięci podręcznej, a następnie zapytać serwer internetowy. Mój projekt polega na użyciu dwóch wątków do wykonania zadania ładowania. Jeden wątek do odczytu pamięci podręcznej i jeden wątek do pobrania. Istnieją 3 wątki, w tym interfejs użytkownika. Każdy z nich ma własną kolejkę komunikatów i używa Handler do komunikacji.Czy powiązana usługa lub dostosowane wątki podczas pobierania czegoś?

Moje pytanie brzmi, czy zamiast tego powinienem korzystać z usług związanych? Faktycznie zdałem sobie sprawę z powyższego projektu i wydaje się, że nic złego, ale GC działa bardzo ciężko, co można wywnioskować z logcat.

Inną kwestią jest to, że istnieje kilka wątków, gdy używam DDMS do monitorowania wątków. Wynika to z tego, że ten sam mechanizm ładowania jest używany w kilku działaniach. Pozwoliłem wątkom wyjść z pętli komunikatów podczas wywoływania funkcji onPause(), jestem pewien, że tylko dwie z nich są żywe w tym samym czasie. Ale widzę je wszystkie w DDMS. (BTW, dlaczego wątki nadal istnieją?) Pozwalałem wątkowi = null;)

Tak, jednym słowem, moje pytanie brzmi: Czy to zadanie ładowania może korzystać z usługi związanej?

Odpowiedz

1

Dlaczego więc używasz wielu wątków? Musisz załadować obraz w tle, a po zakończeniu wyświetlić go w interfejsie użytkownika. To naprawdę nie ma znaczenia dla interfejsu użytkownika, z którego pochodzą obrazy. A używanie wielu wątków nie przyspiesza, po prostu zużywa więcej pamięci. Wystarczy użyć pojedynczego wątku tła: najpierw trafi w pamięć podręczną, a następnie pobierze, jeśli nie trafi.

Usługi są przeznaczone do wykonywania czynności, które nie wymagają interfejsu użytkownika. Jeśli chcesz zaktualizować interfejs w czasie rzeczywistym, usługa nie ma większego sensu.

+0

Dziękuję za odpowiedź. Ale jeden wątek w tle do buforowania i pobierania nie jest wystarczający. W ten sposób obraz w pamięci podręcznej nie zostanie załadowany, dopóki nie zakończą się poprzednie zadania pobierania. W projekcie z dwoma wątkami obraz może być wczytany jak najszybciej, jeśli jest w pamięci podręcznej. O ile mi wiadomo, "Bound Service" może służyć do komunikacji z działaniem. Ten komunikat może być dwustronny, więc teoretycznie obowiązująca usługa dotyczy tej sytuacji. Ale zastanawiam się, czy związana usługa jest bardziej wydajna. – Alley003

+0

Usługa nie jest w żaden szczególny sposób: jeśli chcesz, aby uruchamiał wątki, musisz je utworzyć. W twoim przypadku możesz chcieć mieć wiele (ale ograniczonych) wątków ładujących, abyś mógł szybciej robić rzeczy. Istnieją biblioteki open source, które to robią, a IIRC jest kilka przykładów w kodzie AOSP. W każdym razie usługa nie jest czymś, co można tutaj wykorzystać. –

+0

Oto bardzo dobry: https://github.com/novoda/ImageLoader. Jeśli sprawdzisz źródło, zobaczysz, że nie jest to trywialne i możesz chcieć użyć biblioteki zamiast próbować jej na nowo. –

Powiązane problemy