6

kiedy używam sprawdzania AsyncTasks w DDMS, wątek utrzymujący się w pamięci jako wątek oczekujący po metodzie onPostExecute(), jest taki normalny ?. Oto uproszczony aktywny które reprodukuje mój problem:Wątek AsyncTask nadal po wykonaniu, czy to normalne?

package com.example.async; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 

public class ASyncTaskExampleActivity extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    new ExampleAsyncTask().execute(); 
} 


private class ExampleAsyncTask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... params) { 
     for (int i =0; i<50000;i++){ 
      int j=i*2; 
     } 
     return null; 
    } 

    protected void onPostExecute(Void result) { 
     Log.d("Test","End onPostExecute"); 
    } 

} 

}

Odpowiedz

3

Yep ten sposób unika napowietrznej zabijania i ponownym uruchomieniu wątku momencie składania następnego AsyncTask

jeśli przedstawić kolejną AsyncTask po pierwszy jest zakończony, ten sam wątek zostanie ponownie użyty dla niego

7

AsyncTask wykorzystuje technikę "puli wątków". Każdy AsyncTask, który zaczynasz, dostaje się do kolejki; w "puli" istnieją pewne bezczynne wątki (lub są tworzone w miarę potrzeb aż do pewnego limitu), czekając na zadania. Bezczynny wątek z puli zabiera AsyncTask i wykonuje go, a następnie wraca do puli. Następnie proces powtarza się, dopóki w kolejce nie będzie już żadnych zadań.

Takie podejście ma 2 ważne cechy:

  1. żadnego narzutu tworzenia wątku za każdym razem
  2. w przypadku ogromnym liczby wydajności systemu zadań degraduje wdzięcznie: większość zadań będzie czekać w kolejce i tylko kilka z nich zostanie wykonanych na raz; w końcu wszystkie zostaną wykonane. W przeciwnym razie, jeśli dla każdego zadania został uruchomiony osobny wątek, prawdopodobnie w systemie zabraknie pamięci lub wątków, albo zadania zakończą się na zawsze.

Wątek widoczny w DDMS po zakończeniu zadania AsyncTask jest wątkiem bezczynności w puli.

0

Obie przedstawione tutaj odpowiedzi są poprawne. Oprócz tego status takich wątków w puli będzie "czekać". Zjawisko to można zaobserwować również przy korzystaniu z bibliotek takich jak Okhttp, które wykorzystują pulę połączeń do operacji sieciowych.

Powiązane problemy