gpt4 book ai didi

android - 如何有效地在 gridview 中加载互联网图像?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:19:10 27 4
gpt4 key购买 nike

我正在使用以下示例在我的 Activity 中显示互联网图像。

http://developer.android.com/resources/tutorials/views/hello-gridview.html

在自定义图像适配器中,我直接从互联网加载图像并将其分配给 imageview。

在 gridview 中显示图像,一切正常,但效率不高。

每当我滚动 gridview 时,它会一次又一次地加载图像,这就是 gridview 滚动非常慢的原因

是否有缓存或一些有用的技术可以使它更快?

最佳答案

创建一个返回位图的全局静态方法。此方法将采用参数:context , imageUrl , 和 imageName .

在方法中:

  1. 检查文件是否已存在于缓存中。如果是,返回位图

        if(new File(context.getCacheDir(), imageName).exists())
    return BitmapFactory.decodeFile(new File(context.getCacheDir(), imageName).getPath());
  2. 否则您必须从网络加载图像,并将其保存到缓存中:

    image = BitmapFactory.decodeStream(HttpClient.fetchInputStream(imageUrl));


    <pre><code>FileOutputStream fos = null;
    try {
    fos = new FileOutputStream(new File(context.getCacheDir(), imageName));
    }


    //this should never happen
    catch(FileNotFoundException e) {
    if(Constants.LOGGING)
    Log.e(TAG, e.toString(), e);
    }


    //if the file couldn't be saved
    if(!image.compress(Bitmap.CompressFormat.JPEG, 100, fos)) {
    Log.e(TAG, "The image could not be saved: " + imageName + " - " + imageUrl);
    image = BitmapFactory.decodeResource(context.getResources(), R.drawable.default_cached_image);
    }
    fos.flush();
    fos.close();


    return image;
    </code></pre>

预加载Vector<SoftReference<Bitmap>>使用上述方法在 AsyncTask 中包含所有位图的对象类,还有另一个List拿着Map imageUrls 和 imageNames(供以后需要重新加载图像时访问),然后设置您的 GridView适配器。

我建议使用 SoftReferences 的数组以减少使用的内存量。如果您有大量位图,您很可能会遇到内存问题。

所以在你的getView方法,你可能有类似的东西(其中 iconsVector 持有类型 SoftReference<Bitmap> :

myImageView.setImageBitmap(icons.get(position).get());

你需要做一个检查:

if(icons.get(position).get() == null) {
myImageView.setImageBitmap(defaultBitmap);
new ReloadImageTask(context).execute(position);
}

ReloadImageTask AsyncTask类,只需使用正确的参数调用从上面创建的全局方法,然后 notifyDataSetChangedonPostExecute

可能需要做一些额外的工作来确保您不会在 AsyncTask 已经为特定项目运行时启动它

关于android - 如何有效地在 gridview 中加载互联网图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4225817/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com