继续创造,加快成长!这是我参与「日新计划 10 月更文应战」的第20天,点击检查活动详情,希望咱们多多支撑,帮忙点个赞,谢谢!

前言

原因是我在开发功用需求运用Bitmap的办法:

BitmapFactory.decodeResource(my.main.getResources(),R.drawable.vector_my_need);

成果就倒大霉,运行时直接报错:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.graphics.Bitmap.isRecycled()' on a null object reference

从日志分析,咱们知道是呈现了空指针,当时我先是想自己找原因,成果定位到view的源代码里,是在draw办法中,但没找到,我还没放弃,所以又定位了updateDisplayListIfDirty() 办法以及其他报错对应点,所以总算发现了是我bitmap的运用出了问题:

安卓关于Bitmap.isRecycled()空指针报错的解决方案
找到问题固然是好事,可是如何处理呢?这就要靠查找了,接下来让咱们看看处理办法。

正篇

正确的查找办法

其实我在查找上吃了许多亏,一开始在国内查找上一向给我推C站的成果尽管有点相似但其实都相差甚远,最后我在StackOverflow上找到了答案,这也是曾经让他人困惑的一个问题:

安卓关于Bitmap.isRecycled()空指针报错的解决方案
能够看到有31K人浏览过此问题,所以该问题早有认可的答案:

安卓关于Bitmap.isRecycled()空指针报错的解决方案
意思说,咱们用的vector矢量可制作目标需求创建位图,而不是对其进行解码,且办法在下一个帖子中。

完美的处理方案

其实提到这,我现已明白,是我用SVG图资源放到安卓项目中转成Vector的xml文件,这种文件解码无法取得正确的bitmap,所以我茅塞顿开的点开了下个帖子:

安卓关于Bitmap.isRecycled()空指针报错的解决方案
我为这个标准答案标记了中文解释,给出的是将咱们的vector资源实例成Drawable目标,然后经过Bitmap的创建办法去创建成一个新的bitmap,代码如下:

Drawable d = getResources().getDrawable(R.drawable.your_drawable, your_app_theme);

这一步便是变成Drawable目标,接下来:

public static Bitmap drawableToBitmap (Drawable drawable) {
    if (drawable instanceof BitmapDrawable) {
        return ((BitmapDrawable)drawable).getBitmap();
    }
    Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap); 
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);
    return bitmap;
}

这段代码是将Drawable目标转换成Bitmap封装成了工具办法,便于直接应用于主代码。
而办法内部,也分成两层:
首先第一层,咱们用instanceof测试它左边的目标是否是它右边的类的实例,假如是真命题则直接回来强制转成BitmapDrawable,并直接调用它的getBitmap()办法即可。

安卓关于Bitmap.isRecycled()空指针报错的解决方案
而假如第一层没有成功,则由第二层处理,咱们先实例化Bitmap目标,利用Bitmap的createBitmap()办法输入drawable目标的固有宽高和BItmap通道配置获取bitmap

安卓关于Bitmap.isRecycled()空指针报错的解决方案

安卓关于Bitmap.isRecycled()空指针报错的解决方案
然后调用canvas制作bitmap,最后先用drawable的setBounds()办法为Drawable目标指定一个鸿沟矩形,这是为了调用 draw() 办法前能够确定制作目标将制作的位置,接着用draw()办法完结制作,回来终究的bitmap即完结。

安卓关于Bitmap.isRecycled()空指针报错的解决方案

结语

这仍是我第一次这么容易就获取到了明确的正确处理方案,所以特地记录下来,当然,假如你呈现了这个空指针就不需求去看英文成果了,让咱们更便利的处理这个问题吧。