当前位置: 代码迷 >> Android >> Android Image需要很长时间才能从URL获取
  详细解决方案

Android Image需要很长时间才能从URL获取

热度:43   发布时间:2023-08-04 12:03:43.0

目前,我正在从URL加载图像,并且正在花很长时间,而且我无法弄清为什么,有时花60秒钟以上的时间才能获得不那么大的图像。

我的代码:

获取图像异步任务:

public class GetImageAsyncTask extends AsyncTask<Void, Void, Bitmap> {

String url;
OnImageRetrieved listener;
ImageView imageView;
int height;
int width;

public GetImageAsyncTask(String url, ImageView imageView,OnImageRetrieved listener, int height, int width) {
    this.url = url;
    this.listener = listener;
    this.imageView = imageView;
    this.height = height;
    this.width = width;
}

public interface OnImageRetrieved {
    void onImageRetrieved(Bitmap image, ImageView imageview, String url);
}

protected Bitmap doInBackground(Void... params) {

    Bitmap image = null;

    try {
        image = ImageUtilities.decodeSampledBitmapFromUrl(this.url, this.width, this.height);
    } catch (Exception e) {
        e.printStackTrace();
    }

    return image;
}

    protected void onPostExecute(Bitmap result) {
        this.listener.onImageRetrieved(result, this.imageView, this.url);
    }
}

 public static Bitmap decodeSampledBitmapFromUrl(String url, int reqWidth, int reqHeight) throws IOException {

    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;

    BitmapFactory.decodeStream(new java.net.URL(url).openStream(), null, options);

    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    options.inJustDecodeBounds = false;

    return BitmapFactory.decodeStream(new java.net.URL(url).openStream(), null, options);
}

获取样本量:

public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {

    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        while ((halfHeight / inSampleSize) > reqHeight
                && (halfWidth / inSampleSize) > reqWidth) {
            inSampleSize *= 2;
        }
    }

    return inSampleSize;
}

之所以使用这些方法,是因为如果没有的话,可能会引起记忆并发症,但是似乎花费的时间很长。 是否有一些我没有看到的非常繁重的计算?

您可以使用Picasso或volly库加载图像。我建议使用volly,因为它是由Google本身引入的。

因此,问题出在数组适配器上,并且同时下载了getView()可以被调用100次(可能接近100mb的数据)这一事实。

因此,作为针对这种情况的临时解决方案,我实施了一个全局LruCache单例,在启动异步任务之前先进行了检查。

这显然不是理想的,但现在必须这样做。 我肯定那里有更好的解决方案,如果有人可以提供,我很想听听他们的意见。

  相关解决方案