使用java.net.URL慢慢下载JPG

时间:2013-10-21 00:41:09

标签: android listview download imageview

我需要通过URL加载图像,在ImageView中设置并将文件保存在SD卡中。

这个类可以做到这一点,但速度非常慢...... jpg文件有60kb,在我的10Mbps网络连接中下载3~6秒的时间......

我正在使用它来加载列表视图中的任何图像......

公共类DownloadImageTask扩展了AsyncTask {

ImageView bmImage;
String path;
String filename = "pg0.rsc";
String param;
Context context;

public DownloadImageTask(Context context, ImageView bmImage, String param, String code) {
    this.bmImage = bmImage;
    this.param = param;
    this.path = Environment.getExternalStorageDirectory().toString() + "/.RascunhoCache/." + code + "/";
    this.context = context;
}

protected Bitmap doInBackground(String... urls) {
    String urldisplay = urls[0];
    Bitmap mIcon11 = null;
    try {
        InputStream in = new java.net.URL(urldisplay).openStream();
        mIcon11 = BitmapFactory.decodeStream(in);
    } catch (Exception e) {
        Log.e("Error", e.getMessage());
        e.printStackTrace();
    }
    return mIcon11;
}

protected void onPostExecute(Bitmap result) {       
    bmImage.setImageBitmap(result);
    if(param.equals("c")){
        OutputStream outStream = null;
        new File(path).mkdirs();
        File file = new File(path, filename);
        try {
         outStream = new FileOutputStream(file);
         result.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
         outStream.flush();
         outStream.close();
        }
        catch(Exception e){}
    }
}

}

1 个答案:

答案 0 :(得分:1)

不要直接解码您的数据。首先将其存储在磁盘上。

假设jpeg解码需要在流中前进和后退以解码图像。你能想象会有多慢(在某些情况下甚至不可能)吗?

使用apache中的IOUtils来帮助您处理流和文件。

看一下你的post执行方法。这将在主线程上执行,在执行代码时冻结UI。我们使用AsyncTask来操作位图,但我们这样做是为了减轻UI线程,所以doInBackground中的任何编码/解码/冗长操作都是如此。

而且,在你的catch条款中做一些事情,把它们留空是一个非常糟糕的做法:你的应用程序没有机会知道出错了。它需要恢复,或至少告诉您的用户,或记录一些东西。

最后,你应该看看this thread,有比网络的asynctask更好的方法,一些非常好的库可以帮助很多。