关于从sdcard加载大量图像时AsyncTask的缓慢进程的解决方案

时间:2011-10-07 17:55:04

标签: android android-asynctask

美好的一天,我有一大堆想要从SD卡显示到gridview的图像。我已经按照教程在is链接中执行此操作:

http://mihaifonoage.blogspot.com/2009/11/displaying-images-from-sd-card-in.html

除了图像变得很多之外,一切都很有效,填充它变得非常慢,滚动也很慢。我已经尝试编辑代码以使用ViewHolder方法,但仍然没有运气。

现在,我也使用自定义ListView中的图像填充而不使用AsyncTask,它似乎更快地处理它。是的常识是只使用更快的方法,但想先澄清一些事情。所以我在问:

  1. 是不是AsyncTask在某些情况下会非常慢而且不理想,或者因此使用Gridview或Listview与它有关?有什么理由吗?我问这个原因AsyncTask似乎总是得到非常好的支持。

  2. 任何其他方式,解决方案或提示,我可以让这个过程更快?...

  3. 注意:我会发布我的代码,但它与链接相同,只是我没有在MediaStore查询中使用getThumbnails()。提前谢谢。

    这是我在加载图像时得到的logcat输出的一部分:

    10-07 19:42:54.072: DEBUG/dalvikvm(20291): GC_EXPLICIT freed <1K, 48% free 2886K/5511K, external 1574K/14018K, paused 28ms
    
    10-07 19:42:54.092: DEBUG/dalvikvm(20291): GC_EXPLICIT freed <1K, 48% free 2918K/5511K, external 1574K/14018K, paused 25ms
    
    10-07 19:42:54.122: DEBUG/dalvikvm(20291): GC_EXPLICIT freed <1K, 48% free 2918K/5511K, external 1574K/14018K, paused 25ms
    
    10-07 19:42:54.142: DEBUG/dalvikvm(20291): GC_EXPLICIT freed <1K, 48% free 2918K/5511K, external 1574K/14018K, paused 24ms
    
    10-07 19:42:54.172: DEBUG/dalvikvm(20291): GC_EXPLICIT freed <1K, 48% free 2918K/5511K, external 1574K/14018K, paused 25ms
    
    10-07 19:42:54.202: DEBUG/dalvikvm(20291): GC_EXPLICIT freed <1K, 48% free 2918K/5511K, external 1574K/14018K, paused 25ms
    
    10-07 19:42:54.232: DEBUG/dalvikvm(20291): GC_EXPLICIT freed <1K, 48% free 2918K/5511K, external 14018K/14018K, paused 28ms
    
    10-07 19:42:54.252: DEBUG/dalvikvm(20291): GC_EXPLICIT freed <1K, 48% free 2918K/5511K, external 14018K/14018K, paused 24ms
    
    10-07 19:42:54.282: DEBUG/dalvikvm(20291): GC_EXPLICIT freed <1K, 48% free 2918K/5511K, external 14018K/14018K, paused 24ms
    
    10-07 19:42:54.302: DEBUG/dalvikvm(20291): GC_EXPLICIT freed <1K, 48% free 2918K/5511K, external 14018K/14018K, paused 25ms
    
    10-07 19:42:54.332: DEBUG/dalvikvm(20291): GC_EXPLICIT freed <1K, 48% free 2918K/5511K, external 14018K/14018K, paused 25ms
    
    10-07 19:42:54.362: DEBUG/dalvikvm(20291): GC_EXPLICIT freed <1K, 48% free 2918K/5511K, external 14018K/14018K, paused 25ms
    

2 个答案:

答案 0 :(得分:0)

它很慢,因为实际上你仍在使用一个单独的线程(即一个AsyncTask.execute()调用)按顺序下载所有图像(即在doInBackground()实现中循环所有图像下载)。是的,这是谷歌建议如何使用AsyncTask的方式。

通过调用几个AsyncTask.execute()可能会加速你,这会让你同时运行多个线程并由底层线程池管理(在API级别11之前,此线程池不可访问)。原因,你需要以某种方式将你的下载任务分成几个部分并将每个部分提供给每个AsyncTask.execute():

for (DownloadTask task : tasks) {
  new AsyncTask.execute();
}

查看here了解详情。

答案 1 :(得分:0)

加快这种速度的正确方法是使用图像缓存。 Google提供了一个易于实施的指南here