Android - 2.3.3和4.0操作系统中的异步任务行为

时间:2012-10-26 03:33:17

标签: android multithreading threadpool

我正在测试一个应用程序,其中我们有一个列表视图,其中包含通过网络检索的图像列表。当我在Android设备2.3.3(WIFI速度512 KBPS)上运行应用程序并检查DDMS(线程查看器)时,线程数从25开始持续增加到50但是当我在设备4.0上测试相同的应用程序时(WIFI速度) 5 MBPS),线程数没有增加。

任何人都可以帮助我理解为什么会这样吗?是因为Android OS差异还是其他原因?

提前致谢。

3 个答案:

答案 0 :(得分:13)

您使用的是AsyncTask吗?在Android 3.0之后,使用SERIAL_EXECUTOR在单个线程中执行AsyncTask的默认行为。

如果您希望在任何系统版本上同时运行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的实现存在差异。

尝试在线程完成其工作时添加一些调试日志记录,并查看两个版本之间是否存在差异。

答案 2 :(得分:0)

您可以使用AsyncTaskCompat.executeInParallel for API&lt; 11,你在appcompat 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);
                }
            }
        }
    });

享受