2012-10-26 8 views
5

Ich teste eine Anwendung, wo wir eine Listenansicht mit Liste von Bildern über das Netzwerk abgerufen haben. Wenn ich die Anwendung auf Android-Gerät 2.3.3 (WIFI Geschwindigkeit 512 KBPS) und überprüfen Sie die DDMS (Thread Viewer), die Anzahl der Threads steigt bis 50 von 25 weiter. Aber wenn ich die gleiche Anwendung auf dem Gerät 4.0 (WIFI-Geschwindigkeit 5 MBPS), Anzahl der Threads nicht erhöht.Android - Async Aufgabe Verhalten in 2.3.3 und 4.0 OS

Kann mir jemand helfen zu verstehen, warum das passiert? Ist es aufgrund von Android OS Unterschied oder aus irgendeinem anderen Grund?

Vielen Dank im Voraus.

+1

bitte auf den entsprechenden Code schreiben! – vikki

+0

Ich habe nur die apk-Datei. Ich habe den Code nicht. – Prem

Antwort

13

Verwenden Sie AsyncTask. Nach Android 3.0 wird das Standardverhalten von AsyncTask in einem einzelnen Thread mithilfe von SERIAL_EXECUTOR ausgeführt. Wenn Sie möchten, dass AsyncTask gleichzeitig auf einer beliebigen Systemversion ausgeführt wird, können Sie diesen Code verwenden.

AsyncTask task = new YourTask(); 
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) { 
    task.execute(params); 
} else { 
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); 
} 

Vor OS 1.6 - Mehrere asynchrone Aufgaben werden nacheinander ausgeführt. OS 1.6 bis OS 2.3 - Async Tasks werden parallel ausgeführt. Von 3.0 - Async Tasks wird erneut nacheinander ausgeführt.

+1

Jedes Wort, warum diese Design-Entscheidungen getroffen wurden? –

1

Verwenden Sie eine AsyncTask, um die Hintergrundoperation auszuführen? Ich denke, es gibt einen Unterschied zwischen der Implementierung der AsyncTask zwischen GB und ICS.

Versuchen Sie, eine Debugprotokollierung hinzuzufügen, wenn der Thread seine Arbeit beendet hat, und prüfen Sie, ob zwischen den beiden Versionen ein Unterschied besteht.

+0

Danke dnkoutso ... Ja, Async Task wird verwendet, um die Hintergrundoperation auszuführen. Welche Art von Debug-Protokollierung können wir tun, um es besser zu verstehen? – Prem

+0

Wenn der Thread fertig ist. Wenn es sich um eine asynctask handelt, könnte es einen festen Threadpool geben, der intern verwendet wird. Die Tatsache, dass die Threads da sind, bedeutet nichts, sie werden bei Bedarf wiederverwendet. – dnkoutso

0

Sie können AsyncTaskCompat.executeInParallel für API < 11 verwenden, diese Klasse finden Sie in der appcompat v4-Bibliothek.

Ein exemple Nutzungs:

AsyncTaskCompat.executeParallel(new AsyncTask<Void, Void, Bitmap>() { 
     @Override 
     protected Bitmap doInBackground(Void... params) { 
      return MediaStore.Images.Thumbnails.getThumbnail(
        imageView.getContext().getContentResolver(), 
        id, 
        MediaStore.Images.Thumbnails.MINI_KIND, 
        null); 
     } 
     @Override 
     protected void onPostExecute(Bitmap bitmap) { 
      imageView.setImageBitmap(bitmap); 
      if (bitmap != null) { 
       // Add the image to the memory cache first 
       CACHE.put(id, bitmap); 
       if (listener != null) { 
        listener.onImageLoaded(bitmap); 
       } 
      } 
     } 
    }); 

genießen