android - 使用 java.net.URL 缓慢下载 JPG

标签 android listview download imageview

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

这个类这样做,但是非常慢....jpg 文件有 60kb,在我的 10Mbps 互联网连接中下载它的时间为 3~6 秒...

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

公共(public)类 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){}
    }
}

最佳答案

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

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

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

查看您的后执行方法。这将在主线程上执行,在执行代码时卡住 UI。我们使用 AsyncTask 来操作位图,但我们这样做是为了减轻 UI 线程,所以在 doInBackground 中进行任何编码/解码/冗长的操作。

另外,在你的 catch 子句中做一些事情,将它们留空是一个非常糟糕的做法:你的应用程序没有机会知道出了什么问题。它需要恢复,或者至少告诉您的用户,或者记录一些东西。

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

关于android - 使用 java.net.URL 缓慢下载 JPG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19484617/

相关文章:

android - 仅为特定布局设置 NoActionBar 主题

java - JxBrowser 7.7 SWT - StartDownloadCallback 错误

android - 自定义 Android 布局

android - Xamarin - Android - 启动画面(多个)

wpf - 如何使用 TwoWay 模式将 Listview SelectedItem 绑定(bind)到文本框?

java - ListView "onPopulate"监听器?

c# - 使用 C# API 从 Facebook 下载附件

javascript - Angular 在尝试下载文件时将 "unsafe"添加到 url

java - 如何在Toast中显示数组

c# - ListView - Explorer 如何使小图标 View 中的所有项目大小相同?