Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 解决从SD卡加载大量图像时异步任务进程缓慢的问题_Android_Android Asynctask - Fatal编程技术网

Android 解决从SD卡加载大量图像时异步任务进程缓慢的问题

Android 解决从SD卡加载大量图像时异步任务进程缓慢的问题,android,android-asynctask,Android,Android Asynctask,大家好,我有一大堆图像要从SD卡显示到gridview。我已按照教程在is链接中执行此操作: 一切都很好,除了当图像变得很多时,填充它会变得非常慢,滚动也非常慢。我尝试过使用ViewHolder方法编辑代码,但仍然没有成功 现在,我还使用在自定义ListView中填充图像,而不使用AsyncTask,并且它似乎处理得更快。是的,常识是使用更快的方法,但首先要澄清一些事情。因此,我要问: 是因为AsyncTask在某些情况下非常慢而且不理想,还是因为我使用的是Gridview或Listview与

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

一切都很好,除了当图像变得很多时,填充它会变得非常慢,滚动也非常慢。我尝试过使用ViewHolder方法编辑代码,但仍然没有成功

现在,我还使用在自定义ListView中填充图像,而不使用AsyncTask,并且它似乎处理得更快。是的,常识是使用更快的方法,但首先要澄清一些事情。因此,我要问:

  • 是因为AsyncTask在某些情况下非常慢而且不理想,还是因为我使用的是Gridview或Listview与此有关?有什么原因吗?我问这个问题,因为我的任务似乎总是得到很好的青睐

  • 是否有其他方法、解决方案或提示可以加快此过程

  • 注意:我本来会发布我的代码,但与链接相同的是,我没有在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
    

    10-07 19:42:54.072:DEBUG/dalvikvm(20291):GC_EXPLICIT freed它很慢,因为实际上您仍然在使用一个线程(即一个AsyncTask.execute()调用)按顺序下载所有映像(即在doInBackground()实现中循环所有映像下载)。是的,这就是google建议如何使用AsyncTask的方式

    通过调用多个AsyncTask.execute()可能会加快速度,这会使多个线程同时运行并由底层线程池管理(在API级别11之前,此线程池是不可访问的)。当然,您需要以某种方式将下载任务拆分为多个部分,并将每个部分输入到每个AsyncTask中。execute():


    查看了解更多信息。

    正确的加速方法是使用图像缓存。谷歌有一个简单实现的指南,对吧:

    你能发布设备减速时产生的logcat消息吗。我怀疑您的内存不足。@slayton我已经添加了logcat消息的内容。奇怪,但我没有收到任何错误或警告信息。我不知道是否应该使用BitmapFactory InSampleSize选项来减小图像的大小,但这不会降低图像质量吗?如果图像的分辨率高于屏幕上的像素数,则没有理由不使用InSampleSize来减小采样
    for (DownloadTask task : tasks) {
      new AsyncTask.execute();
    }