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

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

操作机制是,服务器返回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();
        }
    }
    

  

时间: 2024-10-12 18:12:51

多幅图像下载的时间效率问题的相关文章

HashMap的keySet遍历和entrySet遍历时间效率比较

import java.util.Calendar; import java.util.Map; import java.util.HashMap; import java.util.Iterator; import java.util.Set; public class HashMapTest { <span style="white-space:pre"> </span>public static void main(String[] args) { <

python ,shell 脚本 执行同样操作,花费时间效率对比

废话不说,直接上图(第一个是python写的脚本,第二个和第三个是shell): 文件是一份nginx的log文件,总共583万行,然后是统计各个ip出现次数,各个脚本的执行时间如上所示. 测试环境是:centos 6.5,四核cpu,8g内存. 下面是python脚本 结果是:单核情况下,awk 自增运算最快,python脚本次之,awk和sort等命令的组合最次,猜测awk 是c/c++写的,python解释执行,awk | sort |uniq 的组合,估计哪衔接不好,效率最差. pyth

c++ 大于等于 大于 时间效率比较

变成汇编,都是: 大于等于和大于都是电路上的处理,时间上应该差不多. 原文地址:https://www.cnblogs.com/cmyg/p/10046668.html

C++用%20替换字符串中的空格(O(n)的时间效率)

#include <iostream> #include <malloc.h> #include <string.h> using namespace std; //将字符串中的空格用%20替换. void Grial(char *str) { if(str==NULL)return ; char *p = str; char *q = NULL; char buf[strlen(str)+1]; int count = 0;//计数空格数. while(*p!='\0

考虑算法的时间效率

我的机器的配置:

时间效率:把数组排成最小的数

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; public class Solution { public String PrintMinNumber(int [] numbers) { int

O(n)时间效率寻找字符串中第一次出现一次的字符

思路:我们利用简单的哈希映射来解决这个问题 建立一个数组,用数组的下标对应每个字符的值,然后扫描字符串,给每个字符的值对应的数组的位置的数加1,最后再扫描数组,遇到第一个1时,就可以找到对应的字符了 实现代码如下: #include<iostream> #include<cassert> using namespace std; char findch(const char *str, int len) { assert(str != NULL); int ar[256] = {0

时间效率:最小的K个数

输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. import java.util.ArrayList; import java.util.Iterator; import java.util.TreeSet; /* * 利用TreeSet排序并去除重复元素,利用ArrayList存储并输出 */ public class Solution { public ArrayList<Integer> GetLeastNumb

C++数组求最大值及最小值最快方法(3[n/2]的时间效率)

#include <iostream> using namespace std; //最小值和最大值的求解,时间复杂度最多是3[n/2],依据算法导论第九章. void swap(int &a,int &b) { int temp = a; a = b; b = temp; } void Grial(int a[],int n) { int i = 0; if(a[i]>a[i+1]) { swap(a[i],a[i+1]); } for(int j = i+2;j<