Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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:GridView适配器需要下载和显示带有异步任务的图像-速度太慢_Android_Performance_Gridview_Android Asynctask_Android Adapter - Fatal编程技术网

Android:GridView适配器需要下载和显示带有异步任务的图像-速度太慢

Android:GridView适配器需要下载和显示带有异步任务的图像-速度太慢,android,performance,gridview,android-asynctask,android-adapter,Android,Performance,Gridview,Android Asynctask,Android Adapter,我正在开发一个应用程序,它应该可以浏览一个有很多图库和照片的网站的图片。以下是应用程序正在执行的步骤: 从rss提要中提取相册及其图像的URL 用每个相册和一个缩略图构建一个列表视图 ListView的adapter getView()方法将每个项目的ImageView设置为占位符,占位符将被相应的AsyncTask替换为实际缩略图 然后,适配器的getView()执行一个异步任务来获取图像 AsyncTask首先检查缓存,如果图片不存在,则下载 使用WeakReferences,AsyncTa

我正在开发一个应用程序,它应该可以浏览一个有很多图库和照片的网站的图片。以下是应用程序正在执行的步骤:

  • 从rss提要中提取相册及其图像的URL
  • 用每个相册和一个缩略图构建一个列表视图
  • ListView的adapter getView()方法将每个项目的ImageView设置为占位符,占位符将被相应的AsyncTask替换为实际缩略图
  • 然后,适配器的getView()执行一个异步任务来获取图像
  • AsyncTask首先检查缓存,如果图片不存在,则下载
  • 使用WeakReferences,AsyncTasks会用获取的图像更新(或不更新)所需的视图,从而替换占位符

  • 打开相册时,我将执行与步骤2中相同的过程,但使用GridView而不是ListView来显示相册内容

    /* GridViewAdapter.getView(...) follows */
    public View getView(int position, View convertView, ViewGroup parent)
     ImageView thumbnail;
    
     // Recycle or not...
     if (convertView == null) {
       // Create new View
       thumbnail = new ImageView(mContext);
     } else {
       // Recycle View
       thumbnail = (ImageView) convertView;
     }
    
     // Set the placeholder Drawable
     thumbnail.setImageResource(R.drawable.placeholder);
    
    if (position < amountOfPhotos) {
    
        if (album.getLinks().size() >= 1) {
    
          // imageFetcher creates an AsyncTask for every call of loadThumbnail(...)
          imageFetcher.loadThumbnail(thumbnail, album.getURL(position)); 
        }
    
    // Formating the ImageView a little...
    ... 
    
    }
    return thumbnail;
    
    /*GridViewAdapter.getView(…)如下*/
    公共视图getView(int位置、视图转换视图、视图组父视图)
    图像视图缩略图;
    //回收与否。。。
    if(convertView==null){
    //创建新视图
    缩略图=新图像视图(mContext);
    }否则{
    //循环视图
    缩略图=(图像视图)转换视图;
    }
    //将占位符设置为可绘制
    setImageResource(R.drawable.placeholder);
    if(位置=1){
    //imageFetcher为loadThumbnail(…)的每次调用创建一个AsyncTask
    loadThumbnail(缩略图,相册.getURL(位置));
    }
    //稍微格式化ImageView。。。
    ... 
    }
    返回缩略图;
    
  • 问题是异步任务的性能。ListView在我的手机上显示了大约7个项目,当用户滚动列表时,会产生大约12个同步任务。这很好,列表仍然快速生成

    现在相册的GridView一次显示15个项目,滚动列表会创建许多异步任务。由于某些异步任务必须从web下载,因此它们会保持活动状态几秒钟。这完全减慢了异步任务的速度,而异步任务只需从缓存中重新加载位图

    结果是,只要有许多异步任务正在运行,GridView在回滚时就不会显示图像,即使它在几秒钟前才显示图像。只是因为异步任务太多了

    对如何解决我的问题有什么建议吗?我在考虑类似异步任务工厂的东西,在那里我可以对作业进行排队并设置优先级。这样,我可以控制下一步执行哪个作业,还可以控制一次运行的异步任务的最大数量


    如果有人能告诉我,我的方法总体上听起来是否正确,或者我在异步任务方面是否完全走错了方向……

    从Android
    3.0开始,异步任务是按顺序执行的。因此,完全有可能一些长时间运行的
    AsyncTasks
    会阻塞其他任务。为了并发执行,可以使用
    asyncTask.executeOnExecutor(asyncTask.THREAD\u POOL\u EXECUTOR,params)


    但通常一个好的解决方案是创建一个
    ThreadPoolExecutor
    并在其上执行
    Runnables
    。通过这种方式,您可以控制正在运行的任务数量并决定使用哪个顺序

    我建议您使用这样的库,使所有占位符/异步图像下载非常非常容易

    这解释了很多。因此,最好只让一个任务完成所有下载并执行新任务,以便从缓存加载已经存在的内容。如果您这样做,则从缓存获取图像的任务将被阻止,因为图像下载任务将在该时间内执行。我想你可以为
    AsyncTask.THREAD\u POOL\u EXECUTOR
    发布任务,因为它将至少在两个线程中执行任务。哦,我明白了。我认为一些线程在执行后仍然可以并行运行。好的,我来看看
    AsyncTask.THREAD\u POOL\u EXECUTOR
    能做什么。谢谢,我一定会调查的。由于这是我的第一个应用程序,我试图避免大量使用库。但看看毕加索的源代码也没什么坏处嘿@potAito我本来打算给他同样的答案的。在安卓系统中,图像下载/缓存是一项非常深入而复杂的任务,使用毕加索库非常容易。你所要做的就是:
    Picasso.with(context).load(url).into(imageView)它只是works@Budius你的意思是,在这种情况下,自己编写程序不是一件丢脸的事吗?:)好的,我试试看。我现在正在添加毕加索图书馆。我只是说,如果有人已经做了毕加索那样伟大的工作,没有理由重新发明轮子。理解引擎盖下发生的事情非常酷,但仅此而已。我可以向你保证,有很多拥有数百万用户的大型应用程序严重依赖于这些库。@Budius你是绝对正确的。我刚刚在我的应用程序中替换了相应的行,它就像一个符咒。用于下载图像你可以看到这些,