多幅图像下载的时间效率问题

        项目碰到了问题,就是多个头像下载的时候,会出现下载不全,下载慢的问题。

        操作机制是,服务器返回URL, 本地将这些URL放在一个二维数组中,第一列存头像的URL,第二列存头像的本地文件地址。

            1.首先是下载不全的问题,一般这种情况是下载头像的异步任务,出现了不连续性执行的情况,比如当下载图像的URL列表中出现有空字符串或者null时,异步任务会捕捉异常,不再继续接着往下下载,所以出现下载不全的问题。起初的解决方法是,在下载头像的异步任务中,循环下载的时候,如果取到的URL为空,则不执行调取下载图片的工具类函数,这样的结果是,不会出现下载不全,但是下载速度着实让人捉急!所以转回到了下载慢的问题。

            2、下载速度慢,一般是数据结构处理不当,这里我用了二维数组就是一个槽点,并且在异步任务中,循环下载的头像的时候,进行判断,着实更是加了一步,应该传给异步任务一个不需再处理的数据,然后让异步任务自己去执行,所以最后我改回了采用arraylist,1,这样可以动态添加非空的字符串,2.一维的arraylist处理效率要高很多,所以最后的代码就是这样:

//下面是初始化下载列表的参数
if(!commentContent.commentportraiturl.equals("")){
                                    commentImgHeadURl.add(commentContent.commentportraiturl);
                                    commentImgHeadURl.add(GPUtils.getAppPath().replace("/wrongpic", "/newspic")    +"/newspic"
                                                        +commentContent.commenttopic+ commentContent.commentuid + ".jpg");
                                }
//下载讨论列表用户头像的异步任务
    private class DownloadImgTask extends AsyncTask<ArrayList<String>, String, String>{
        private ArrayList<String> commentImgUrl = null;
        public DownloadImgTask(ArrayList<String> commentImgUrl) {
            // TODO Auto-generated constructor stub
            this.commentImgUrl = commentImgUrl;
        }
        protected void onPreExecute() {
            //TODO:缓冲提示
            super.onPreExecute();
        }
        @Override
        protected String doInBackground(ArrayList<String>... params) {
            // TODO Auto-generated method stub
            //在此获取要下载的图片的url
            com.haojiazhang.download.DownloadManager dm = GPUtils.GetDownloadManager();
            try {
                for(int i = 0; i < commentImgUrl.size(); i=i+2){//一对一对的取数据,第一个是下载的URL,第二个是存本地的图像路径
                    if(!dm.downloadImg(commentImgUrl.get(i),commentImgUrl.get(i+1)))
                        return "isdownloadfail";
                }
                return "isdownloadok";
            } catch (Exception e){
                
            }
            return null;
        }            
        protected void onPostExecute(String result) {
            if(result!=null && result.equalsIgnoreCase("isdownloadok")){                
//                GPUtils.toast(context, "题目下载成功");
                discussesAdapter.notifyDataSetChanged();
                
            }else {
//                GPUtils.toast(context, "题目下载失败");
            }
            super.onPostExecute(result);
        }
        protected void onCancelled() {
            super.onCancelled();
        }    
    }
    

  

原文地址:https://www.cnblogs.com/lucky-star-star/p/4167839.html