我正在关注本教程以在 android 中延迟加载列表视图。 http://www.coderzheaven.com/2012/09/23/simplest-lazy-loading-listview-android-data-populated-mysql-database-php/
但问题是列表加载缓慢,但图像以提供的顺序方式下载。即,较小的图像不会像那样首先下载。他们在本教程中做错了什么?
我正在关注本教程以在 android 中延迟加载列表视图。 http://www.coderzheaven.com/2012/09/23/simplest-lazy-loading-listview-android-data-populated-mysql-database-php/
但问题是列表加载缓慢,但图像以提供的顺序方式下载。即,较小的图像不会像那样首先下载。他们在本教程中做错了什么?
据我所知,本教程没有任何问题。它使用以下代码在 getView() 上启动一个 Asyntask:
new DownloadImageTask().execute(pb_and_image);
这就是使它异步的关键。
结果,不是在执行 getView 方法(在 UI 线程中)时执行代码来获取图像,而是在AsyncTask的后台线程中执行昂贵的执行,并且其结果是异步传递的。无法保证顺序,因为每行的 getView 调用顺序不受您的控制。
如果您的应用程序针对(并在)API 级别 12 或更高级别上运行,您所描述的可能是预期行为。如果你在 API 级别 9 上运行你的代码——如果你的应用程序支持它——你会看到同样的行为发生吗?如果不是,那很可能是问题所在。
从 API 级别 12 开始,AsyncTask
默认会按顺序执行多个并发,以减少出现意外错误和竞态条件的机会。但是,如果您使用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
而不是开始任务execute()
,它们将并行运行,并且不会等待前面的任务完成。
如果您想进一步阅读,这里是Dianne Hackborn 的一篇很好的文章,解释了其背后的基本原理。