2012-10-26 16 views
5

Sto testando un'applicazione in cui abbiamo una vista elenco con un elenco di immagini recuperate tramite rete. Quando eseguo l'applicazione su dispositivo Android 2.3.3 (velocità WIFI 512 KBPS) e controllo DDMS (Thread Viewer), il numero di thread continua ad aumentare fino a 50 da 25. Ma quando provo la stessa applicazione su dispositivo 4.0 (velocità WIFI 5 MBPS), il numero di thread non è aumentato.Android - Comportamento attività asincrona nei sistemi operativi 2.3.3 e 4.0

Qualcuno può aiutarmi a capire perché questo sta accadendo? È dovuto alla differenza del sistema operativo Android o per altri motivi?

Grazie in anticipo.

+1

si prega di inviare il codice in questione! – vikki

+0

Ho solo il file apk. Non ho il codice. – Prem

risposta

13

Si sta utilizzando AsyncTask. Dopo Android 3.0, il comportamento predefinito di AsyncTask viene eseguito in un singolo thread utilizzando SERIAL_EXECUTOR.

Se si desidera eseguire AsyncTask contemporaneamente in qualsiasi versione di sistema, è possibile utilizzare questo codice.

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); 
} 

Pre OS 1.6 - Attività asincrone multiple vengono eseguite in sequenza. OS 1.6 fino a OS 2.3 - Attività asincrone eseguite in parallelo. Da 3.0 - Ancora, Task asincroni viene eseguito in sequenza.

+1

Qualche parola sul perché sono state fatte quelle scelte progettuali? –

1

Si sta utilizzando un AsyncTask per eseguire l'operazione in background? Penso che ci sia una differenza tra l'implementazione di AsyncTask tra GB e ICS.

Provare ad aggiungere una registrazione di debug quando il thread termina il suo lavoro e vedere se c'è una differenza tra le due versioni.

+0

Grazie dnkoutso ... Sì, Async Task viene utilizzato per eseguire l'operazione in background. Che tipo di registrazione del debug possiamo fare per capirlo meglio? – Prem

+0

Quando il thread ha finito di funzionare. Se è un asynctask, potrebbe esserci un threadpool fisso usato internamente. Il fatto che i thread ci siano non significa nulla, saranno riutilizzati se necessario. – dnkoutso

0

È possibile utilizzare AsyncTaskCompat.executeInParallel per API < 11, questa classe si trova nella libreria appcompat v4.

Un esempio di utilizzo:

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); 
       } 
      } 
     } 
    }); 

godono

Problemi correlati