Android 检查ImageView是否具有未调用getDrawable方法的图像

Android 检查ImageView是否具有未调用getDrawable方法的图像,android,android-layout,android-view,drawable,Android,Android Layout,Android View,Drawable,下一行正在抛出OutOfMemoryException if (null == myImage.getDrawable()){ //... } 是否有其他方法检查ImageView是否具有可绘制/位图?在这种情况下,我将使用ImageView上的setTag和getTag。在xml中,第一次将标记设置为空,并且无论何时绑定任何可绘制文件,都要使用setTag()为标记设置一些值。 如果标记具有某个值,则假定imageview具有可绘制的,如果该值为空,则imageview不具有可绘制的 希

下一行正在抛出OutOfMemoryException

if (null == myImage.getDrawable()){
  //...
}

是否有其他方法检查ImageView是否具有可绘制/位图?

在这种情况下,我将使用
ImageView
上的
setTag
getTag
。在xml中,第一次将标记设置为空,并且无论何时绑定任何可绘制文件,都要使用
setTag()为标记设置一些值。

如果标记具有某个值,则假定imageview具有可绘制的,如果该值为空,则imageview不具有可绘制的


希望这对您有所帮助

在这种情况下,我将使用
ImageView
上的
setTag
getTag
。在xml中,第一次将标记设置为空,并且无论何时绑定任何可绘制文件,都要使用
setTag()为标记设置一些值。

如果标记具有某个值,则假定imageview具有可绘制的,如果该值为空,则imageview不具有可绘制的


希望这能帮助您

这可能只解决症状,但您可以尝试在androidmanifest应用程序标记中添加android:largeHeap=“true”

这可能只解决症状,但您可以尝试在androidmanifest应用程序标记中添加android:largeHeap=“true”

您必须注意内存使用情况,这里有一个快速而肮脏的解决方案

try {
   if (myImage.getDrawable() == null)
     doFoo();
   else
     doBar();
 } catch (OutOfMemoryError e) {
   //the ImageView definetely had some large content
     doBar();
 }

不过,你必须注意你的内存使用情况,这里有一个快速而肮脏的解决方案

try {
   if (myImage.getDrawable() == null)
     doFoo();
   else
     doBar();
 } catch (OutOfMemoryError e) {
   //the ImageView definetely had some large content
     doBar();
 }

这将是一种变通方法。调用imageview.getWidth()或getHeight()。如果该值为0,则不会加载任何图像

这将是一个解决方法。调用imageview.getWidth()或getHeight()。如果该值为0,则不会加载图像

您可以覆盖ImageView类,并在调用setDrawable方法时填充一些布尔值

public class CustomImageView extends ImageView {
    public boolean isImageSet = false;

    public void setImageBitmap(Bitmap bm) {
        super.setImageBitmap(bm);
        if(bm != null)
            isImageSet = true;
    }
}

调用setDrawable方法时,可以覆盖ImageView类并填充一些布尔值

public class CustomImageView extends ImageView {
    public boolean isImageSet = false;

    public void setImageBitmap(Bitmap bm) {
        super.setImageBitmap(bm);
        if(bm != null)
            isImageSet = true;
    }
}

那么,我似乎这么早就惹恼了某人。我道歉。不过,你不赞成背后的秘密并没有起到什么作用。那么,我似乎这么早就让人不高兴了。我道歉。但是,你不赞成背后的秘密并没有起到任何作用。伙计,这听起来是个很棒的主意。但是我使用毕加索加载我的图像(使用
调整大小(newSize,newSize)
),因此不容易知道何时设置标签。但是+1,因为如果不是这样,我认为这应该行得通。在调用picasso loadImage()方法之前,使用一些valueMan将标记设置为imageview,这听起来是一个很棒的主意。但是我使用毕加索加载我的图像(使用
调整大小(newSize,newSize)
),因此不容易知道何时设置标签。但是+1,否则,我认为应该可以。在调用picasso loadImage()方法之前,请使用某个值将标记设置为imageview我已经在这样做了,但问题是如果出现错误,
doBar
将不会执行。这有点讽刺,因为如果没有图像,我不想执行
doBar
,但如果有图像,执行就有点关键了。@KatedralPillon将调用放在
catch
子句中?@KatedralPillon,我想在这种情况下,只有一个优雅的解决方案——考虑一下图像加载机制,防止错误发生。如果你使用的是毕加索,那么你会得到一个OOM,这有点奇怪,除非你没有做错什么,比如在
列表
网格视图
中创建多个毕加索实例。尝试使用
.skipMemoryCache()
并查看Android Studio的内存监控工具我已经在这么做了,但问题是如果出现错误,
doBar
将不会执行。这有点讽刺,因为如果没有图像,我不想执行
doBar
,但如果有图像,执行就有点关键了。@KatedralPillon将调用放在
catch
子句中?@KatedralPillon,我想在这种情况下,只有一个优雅的解决方案——考虑一下图像加载机制,防止错误发生。如果你使用的是毕加索,那么你会得到一个OOM,这有点奇怪,除非你没有做错什么,比如在
列表
网格视图
中创建多个毕加索实例。试着使用
.skipMemoryCache()
,同时看看Android Studio的内存监控工具,我很可能最终会这样做。唯一的问题是,现在我必须到处使用这个自定义视图,包括在xml布局文件中,否则我无法强制转换它+我赞成这个想法。谢谢。我很可能最终会这么做。唯一的问题是,现在我必须到处使用这个自定义视图,包括在xml布局文件中,否则我无法强制转换它+1个想法。谢谢