2013-09-24 10 views
7

AsyncTask został zaprojektowany jako klasa pomocnicza wokół wątku i obsługi i nie stanowi ogólnej struktury wątków. AsyncTasks powinny być idealnie wykorzystywane do krótkich operacji (kilka sekund co najwyżej).Asynctask intensywnego użytkowania

to co jest napisane w dokumentacji.

Mówiący język sieciowy, jak długo trwa "kilka sekund"?

Moja aplikacja zrobi co następuje, uzyska listę z DB, wyśle ​​ją na serwer, uzyska inną listę (json), wyśle ​​okej, że otrzymała listę, parsuje jsony, wstawi listę do db, do niektóre inne procesy w db, aktualizacji UI .. (lista może sięgać 5000-1000 wpisów instancji obiektów.)

Czy użycie asynktaksu dla takich rzeczy jest dobrym pomysłem? Muszę również zaktualizować GUI zgodnie z wynikami odpowiedzi z serwera.

Jeśli nie, jakie mam inne alternatywy?

+1

IntentService może? – gunar

+0

kilka jest rzadko więcej niż jednym rzędem wielkości. to, co opisujesz, wydaje się dość długie, co oznacza, że ​​użytkownicy będą wychodzić z działalności i oczekują ukończenia leczenia w tle.asynktask nie wydaje się tutaj odpowiedni. I +1 gunar i polecam i IntentService – njzk2

+0

co do cholery "kilka jest rzadko więcej niż jeden rząd wielkości" oznacza partnera? zostanie to zrobione po cichu w tle, a użytkownicy nie opuszczą aplikacji .. @ njzk2 – tony9099

Odpowiedz

4

Zrobiłem już coś podobnego do ciebie. Pobrałem kilka zdjęć (około 5000), zapisałem je na karcie SD i zapisałem wiersz w bazie danych. Użyłem Async Task bez problemów i nie widzę problemu z jego używaniem. Polecam użyć paska postępu, aby pokazać użytkownikowi, co robi i aplikacji z opcją anulowania zadania (AsyncTask zapewnia mechanizm anulowanie)

+1

OK @ACDias, wygląda obiecująco, o ile mogę powiedzieć, Asynctask poradzi sobie z ilością pracy jaką wykonam, ponieważ mój byłby tylko tekstem raczej obrazem. – tony9099

+0

+1 Dla wskazówek dotyczących paska postępu. – HoodVinci

3

Zobacz tę odpowiedź: AsyncTask for long running operations

Podsumowując, długo- AsyncTasks może tworzyć wycieki pamięci ze względu na jego implementację. Może również powodować problemy ze zmianami orientacji.

1

To właśnie rozumiem. W rzeczywistości AsyncTask są głównie skorelowane z interfejsem użytkownika. Na przykład OnPostExecute jest wykonywany w wątku interfejsu użytkownika.

W moim rozumieniu można bezpiecznie używać AsyncTask, jeśli użytkownik może rozsądnie poczekać na zakończenie operacji.

Najlepszym sposobem sprawdzenia, czy Twoje zadanie spełnia warunki, jest wypróbowanie.

0

chodzi Orientacja ekranu:

Po przeczytaniu odpowiedzi na tej stronie, zdałem sobie sprawę, że moja aplikacja nie może obsłużyć zmiany orientacji podczas biegu AsyncTask.

Oto moje rozwiązanie tego problemu:

@Override 
protected void onPreExecute() { 
    Device.lockOrientation((Activity)context); 
    ... 
} 

@Override 
protected void onPostExecute(List<Hydrant> hydrants) { 
    Device.releaseOrientation((Activity)context); 
    ... 
} 

Realizacja urządzenia:

public class Device { 

    public static void lockOrientation(Activity activity) { 
     Display display = ((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
     int rotation = display.getRotation(); 
     int tempOrientation = activity.getResources().getConfiguration().orientation; 
     int orientation = 0; 
     switch(tempOrientation) 
     { 
     case Configuration.ORIENTATION_LANDSCAPE: 
      if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_90) 
       orientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; 
      else 
       orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE; 
      break; 
     case Configuration.ORIENTATION_PORTRAIT: 
      if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_270) 
       orientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT; 
      else 
       orientation = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT; 
     } 
     activity.setRequestedOrientation(orientation); 
    } 

    public static void releaseOrientation(Activity activity) { 
     activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 
    } 

} 

Jak AsyncTasks mają działać tylko przez kilka sekund, jest to akceptowalne rozwiązanie dla mnie jako to rzadko będzie miało wpływ na użytkownika. Zwłaszcza z czymś takim jak ProgressDialog dającym dobry wskaźnik tego, jak długo będzie musiała czekać.

Powiązane problemy