2015-04-20 11 views
5

Mam główną aktywność, która używa fragmentów.Fragmenty i wątki w Androidzie

onCreate stanowi główną działalność kończy onCreate z wykorzystaniem

welcomeFragment = new MyWelcomeFragment(); 
fr.beginTransaction().replace(R.id.mainContent, welcomeFragment).commit() 

jako część MyWelcomeFragment w serwisie onResume, wątek jest uruchomiona, aby uzyskać aktualizacje z mojego serwera WWW. Jeśli użytkownik wybierze akcję przed ukończeniem wątku i przejdzie do MyNewsFragment, co stanie się z wątkiem, który nie zostanie jeszcze ukończony w wątku wątku MyWelcomeFragment?

Temat został stworzony z: (myThread i obsługi są zmienne instancji)

myThread = new Thread(new Runnable() { 
       @Override 
       public void run() { 
        sendDataToServer(""); 
        handler = new Handler(Looper.getMainLooper()); 
        handler.post(new Runnable() { 
         public void run() { 
          onTaskDone(); 
         } 
        }); 
       } 
      }); 
      myThread.start(); 
+0

Co to jest * stos wątków *? – dcow

+1

To "onTaskDone" może być problematyczne, jeśli spróbuje zaktualizować części widoku i "Działanie" jest już zakończone. Dlaczego nie używasz standardowego API 'AsyncTask'? –

+0

wątek będzie działał, dopóki nie zakończy zadania – apk

Odpowiedz

2

Dalvik przechowuje wszystkie odniesienia do wątków w środowisku wykonawczym, więc wątek będzie nadal działać, chyba że zostanie zakończony lub zakończony (część reference). W zależności od miejsca rozpoczęcia wątku możesz utworzyć więcej niż jeden. Istnieje no clean way, aby anulować wątek. W takim przypadku może zajść potrzeba anulowania żądania HTTP wewnątrz sendDataToServer i użycia wspólnej flagi, aby zatrzymać wątek.

w większym zdjęciu, chciałbym zaproponować

  • ruch metoda sieci działalności i obsługiwać go tam, ponieważ ma dłuższą żywotność niż Fragment
  • wykorzystanie Android Volley do obsługi sieci. Dzięki niemu możesz zarządzać nieumyślnymi wielokrotnymi żądaniami wysłania danych na serwer. Ponieważ każde żądanie może być dołączone za pomocą znacznika, możesz je anulować za pomocą określonego znacznika w kolejce (w twoim przypadku odpowiadającego procesowi sendDataToServer) przed rozpoczęciem nowego.
  • i wreszcie użyj wzorca Publisher-Subsriber, który został już udostępniony przez biblioteki takie jak Otto lub EventBus. Pozwala to na komunikację pomiędzy Fragmentami lub Aktywnościami, unikając problemów związanych z cyklem życia. W istocie: wydawca emituje zdarzenia dla zarejestrowanych subskrybentów i w przeciwieństwie do słuchaczy zarówno wydawca, jak i subskrybent są całkowicie oddzieleni. W twoim przypadku, gdy sendDataToServer się zakończy, nie będziesz wiedział, czy fragment zawierający onTaskDone nadal istnieje. Jeśli ta metoda manipuluje interfejsem użytkownika, gdy fragment zniszczył jego widok, na pewno wystąpi błąd. Tak więc onTaskDone powinien być zawinięty wewnątrz metody subskrybenta, którego fragment macierzysty jest zarejestrowany w wydawcy zdarzeń http i wyrejestrowany, gdy tylko jego widok zostanie zniszczony.
0

Temat będzie nadal działa aż MyWelcomeFragment żyje i jeśli nie zabić go w onPause().

+0

To nie jest prawda. Jeśli nie zostanie zabity i nadal będzie żył, wątek będzie działał nawet po zniszczeniu Fragmentu lub Aktywności. – inmyth

1

Będzie działał, dopóki nie zakończy się metoda run(), co prawdopodobnie trwa tyle, ile zajęło wykonanie sendDataToServer (""), ponieważ program obsługi powinien być dość szybki w porównaniu z siecią IO - lub wątkiem jest przerwana siła.

Czy nadal interesuje Cię wynik, jeśli użytkownik przełącza fragmenty?

Czy zachowujecie odniesienie do fragmentu powitalnego? (Za pomocą menedżera fragmentów lub działania) - jeśli tak, możesz uzyskać dostęp do wyniku.

Jeśli użytkownik powróci do fragmentu powitalnego, poprzednie odniesienie do wątku zostanie utracone.

+0

Po zakończeniu zadania wyniki są zapisywane we współdzielonym pref i licznik jest aktualizowany. To musi się zdarzyć tylko wtedy, gdy fragment zostanie aktywowany, dlatego nie znajduje się w głównym działaniu. – justdan0227