【问题标题】:Show image from URL, Android-app goes extremly slow从 URL 显示图像,Android 应用程序变得非常缓慢
【发布时间】:2014-02-09 00:48:55
【问题描述】:

我正在尝试通过 URL 在我的应用程序中显示图像,但是当(仅当)显示位图时,应用程序变得太慢了。该应用程序运行正常,但是当我加载图像时,它变得非常慢。有人可以帮忙吗?

所以我有一个名为 ImageDownload 的类来进行下载,并且在我的 Fragment 中有:

new ImageDownload((ImageView) login_image, this.getActivity().getApplicationContext(),"login_image")
        .execute(path);

这是我的下载类:

public class ImageDownload extends AsyncTask<String, Void, Bitmap> {
private Context mContext;
private String filename;
ImageView bmImage;

public ImageDownload(ImageView bmImage, Context mContext, String filename) {
    this.bmImage = bmImage;
    this.mContext = mContext;
    this.filename = filename;
}

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,null,null);
        //EDIT:

        in.close();

        // The isuue is not soved yet 

    } catch (Exception e) {

        e.printStackTrace();

    }
    return mIcon11;
}

protected void onPostExecute(Bitmap result) {

    bmImage.setImageBitmap(result);

}

}

【问题讨论】:

  • 你的位图有多大?
  • hmmm 如果你的位图很大并且没有正确缩放,我的意思是如果它的原始比率是 3:4 并且你有不同的纵横比,那么如果你滚动屏幕,它应该会很慢,更好选项是在内存中加载较小的版本并保持图像的纵横比
  • 好吧,我不需要缩放图像。我正在为平板电脑开发,它适合我的屏幕。我的 Activity 中有一些 EditText,当显示位图时它变得太慢了。
  • 只是为了实验,您是否尝试使用此图像作为资源?它是否表现出相同的行为?
  • 是的,我试过了。当我从资源 un res 文件夹设置 ImageBitmap 时,它工作得很好。我还尝试将下载的位图保存到 InternalStorage,然后将其设置为 ImageBitmap 但仍然......同样的问题。

标签: android image performance url bitmap


【解决方案1】:

然后是 ImageBitmap 大小和平板电脑 RAM 大小的问题。在 RAM 上加载 ImageBitmap 会占用太多 RAM。您可以通过查看日志来检测到这一点,System.gc() 被调用的频率是多少,因为系统面临的页面缺失比页面命中过于频繁,这几乎就像颠​​簸问题。我确定系统如此频繁地调用.gc(),并且在GUI 线程中调用System.gc(),这会扰乱UI 体验。

【讨论】:

  • 好的,所以我认为你是对的。这是最后一条 GC 消息。它表明只有 1% 是免费的。我该如何解决?消息:GC_FOR_ALLOC 释放 18K,1% 释放 56205K/56624K,暂停 3ms,总共 3ms
  • 解决方案是要么减少位图的 RAM 大小,即在将位图设置为 ImageView 之前非常有效地缩小位图,要么增加平板电脑的 RAM 大小,不幸的是最后一个是不可能的 :(
  • 怎么可能显示一个小位图,杀死我的整个 RAM 内存?它必须是其他东西......请记住,即使我从 InternalStorage 中获取图像,应用程序也会变慢。 Si 只是为了显示一张图片,我的内存不够了?
  • 您能否检查一下在创建位图之前和创建位图之后有多少可用内存?我参与过很多项目,其中 ListView 有超过 500 多个不同的图像,我通过正确创建和销毁 Bitmap 实例以及维护已下载图像的缓存解决了这个问题。你能在这里发布你的完整代码吗?带有布局 xml、活动和 AsyncTask 代码?
【解决方案2】:

您应该使用 Google 的 Volley 库

【讨论】:

    【解决方案3】:

    使用Picasso。简单又酷。

    【讨论】:

      【解决方案4】:

      我终于找到了答案。看看这个。将来可能会对您有所帮助。谢谢大家。这非常有效:

      http://www.technotalkative.com/android-load-images-from-web-and-caching/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-05
        • 2017-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多