2011-10-07 64 views
1

好日子所有,我有一个图像我想从一个SD卡显示到一个GridView的负载。我也跟着教程在做,这是链接:解决方案从AsyncTask从sdcard加载大量图像时缓慢的过程

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

一切正常,除了伟大的,当图像成为很多,就变得很慢,以填充它,然后滚动也很慢的事实。我曾尝试编辑代码以使用ViewHolder方法,但仍然没有运气。

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

  1. 难道是可以的AsyncTask在某些情况下非常缓慢和不理想或因此说我使用一个GridView或ListView有什么用它做的事实呢?任何理由?我问这个原因AsyncTask似乎总是得到很好的偏好。

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

注:我会公布我的代码,但其同样的事情为纽带只有我,我不在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 
+0

您可以发布设备变慢时产生的logcat消息吗?我怀疑你的内存不足。 – slayton

+0

@slayton我已经添加了logcat消息的样子。奇怪,但我没有收到任何错误或警告信息。我不知道是否应该使用BitmapFactory的InSampleSize选项来减小图像的大小,但这不会降低图像质量吗? – irobotxxx

+0

如果您的图像的分辨率高于它们在屏幕上显示的像素数量,则没有理由不使用inSampleSize对其进行缩减采样 – slayton

回答

0

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

通过调用几个AsyncTask.execute()可能会加快你的速度,这使得你可以同时运行多个线程并由底层线程池管理(在API级别11之前,这个线程池是不可访问的)。原因,你需要以某种方式分拆您的下载任务分成若干件每件送入每个AsyncTask.execute():

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

退房here以获取更多信息。

0

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