2012-10-26 70 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); 
       } 
      } 
     } 
    }); 

享受