gpt4 book ai didi

android - 从使用 Picasso 加载的 ImageView 获取位图

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:51:40 25 4
gpt4 key购买 nike

我有一个加载图像的方法,如果图像没有被加载,它会在服务器上寻找它。然后它将其存储在应用程序文件系统中。如果它在文件系统中,它会加载该图像,因为这比从服务器中提取图像要快得多。如果您在没有关闭应用程序之前加载了图像,它将存储在静态字典中,以便可以在不使用更多内存的情况下重新加载它,以避免内存不足错误。

在我开始使用 Picasso 图像加载库之前,这一切都运行良好。现在我正在将图像加载到 ImageView 中,但我不知道如何获取返回的位图,以便我可以将其存储在文件或静态字典中。这使事情变得更加困难。因为这意味着它每次都会尝试从服务器加载图像,这是我不想发生的事情。有没有办法在将位图加载到 ImageView 后获取它?下面是我的代码:

public Drawable loadImageFromWebOperations(String url,
final String imagePath, ImageView theView, Picasso picasso) {
try {
if (Global.couponBitmaps.get(imagePath) != null) {
scaledHeight = Global.couponBitmaps.get(imagePath).getHeight();
return new BitmapDrawable(getResources(),
Global.couponBitmaps.get(imagePath));
}
File f = new File(getBaseContext().getFilesDir().getPath()
.toString()
+ "/" + imagePath + ".png");

if (f.exists()) {
picasso.load(f).into(theView);

下面这一行是我尝试检索位图时抛出的空指针异常,我认为这是因为 Picasso 需要一段时间才能将图像添加到 ImageView

            Bitmap bitmap = ((BitmapDrawable)theView.getDrawable()).getBitmap();
Global.couponBitmaps.put(imagePath, bitmap);
return null;
} else {
picasso.load(url).into(theView);
return null;
}
} catch (OutOfMemoryError e) {
Log.d("Error", "Out of Memory Exception");
e.printStackTrace();
return getResources().getDrawable(R.drawable.default1);
} catch (NullPointerException e) {
Log.d("Error", "Null Pointer Exception");
e.printStackTrace();
return getResources().getDrawable(R.drawable.default1);
}
}

如有任何帮助,我们将不胜感激,谢谢!

最佳答案

使用 Picasso,您无需实现自己的静态字典,因为它会自动为您完成。 @intrepidkarthi 是正确的,因为图像在第一次加载时由 Picasso 自动缓存,因此它不会不断调用服务器来获取相同的图像。

话虽这么说,但我发现自己处于类似的情况:我需要访问下载的位图,以便将其存储在我的应用程序中的其他位置。为此,我稍微调整了@Gilad Haimov 的回答:

Java,带有旧版本的 Picasso:

Picasso.with(this)
.load(url)
.into(new Target() {

@Override
public void onBitmapLoaded (final Bitmap bitmap, Picasso.LoadedFrom from) {
/* Save the bitmap or do something with it here */

// Set it in the ImageView
theView.setImageBitmap(bitmap);
}

@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {}

@Override
public void onBitmapFailed(Drawable errorDrawable) {}
});

Kotlin,Picasso 版本 2.71828:

Picasso.get()
.load(url)
.into(object : Target {

override fun onBitmapLoaded(bitmap: Bitmap, from: Picasso.LoadedFrom) {
/* Save the bitmap or do something with it here */

// Set it in the ImageView
theView.setImageBitmap(bitmap)
}

override fun onPrepareLoad(placeHolderDrawable: Drawable?) {}

override fun onBitmapFailed(e: Exception?, errorDrawable: Drawable?) {}

})

这使您可以访问已加载的位图,同时仍然异步加载它。您只需要记住在 ImageView 中设置它,因为它不再自动为您完成。

附带说明一下,如果您有兴趣了解图像的来源,可以使用相同的方法访问该信息。上述方法的第二个参数 Picasso.LoadedFrom from 是一个枚举,它让您知道从哪个源加载位图(这三个源是 DISKMEMORY, and NETWORK. ( Source ). Square Inc. 还提供了一种可视化方式,通过使用 here 解释的调试指示器来查看位图的加载位置。

希望对您有所帮助!

关于android - 从使用 Picasso 加载的 ImageView 获取位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24682217/

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