2012-10-26 117 views
5

我正在測試一個應用程序,我們有一個列表視圖與網絡上檢索的圖像列表。當我在android設備2.3.3(WIFI速度512 KBPS)上運行應用程序並檢查DDMS(線程查看器)時,線程數量從25增加到50。但是當我在設備4.0上測試相同的應用程序(WIFI速度5 MBPS),線程數量沒有增加。Android - 異步任務行爲在2.3.3和4.0操作系統

任何人都可以幫助我理解爲什麼會發生這種情況嗎?這是由於Android操作系統差異或任何其他原因?

在此先感謝。

+1

請張貼相關的代碼! – vikki

+0

我只有apk文件。我沒有代碼。 – Prem

回答

13

你期運用AsyncTask。在Android 3.0之後,AsyncTask的默認行爲是使用SERIAL_EXECUTOR在單個線程中執行的。

如果您在任何系統版本要AsyncTask同時運行,你可以使用此代碼。

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 - 多個異步任務按順序執行。 OS 1.6至OS 2.3 - 異步任務並行運行。 從3.0開始 - 同樣,異步任務依次執行。

+1

關於爲什麼選擇這些設計的任何說法? –

1

你使用的AsyncTask來執行後臺操作?我認爲GB和ICS之間的AsyncTask的實現是有區別的。

嘗試添加一些調試記錄當線程完成其工作,並查看是否有兩個版本之間的差異。

+0

謝謝dnkoutso ...是的,異步任務是用來執行後臺操作。我們可以通過什麼樣的調試日誌來更好地理解它? – Prem

+0

當你的線程完成工作。如果它的一個asynctask在內部可能有一個固定的線程池。線程在那裏並不意味着什麼,如果需要的話,它們將被重用。 – dnkoutso

0

您可以使用AsyncTaskCompat.executeInParallel的API < 11,你會發現這個類在程序兼容性V4庫。

使用的爲例:

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

享受