NullPointerException异常的createBitmap()从查看 [英] NullPointerException in createBitmap() from View

查看:309
本文介绍了NullPointerException异常的createBitmap()从查看的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我现在用的是跌破$ C $下得到一个位图查看

 私有静态位图loadBitmapFromView(查看yourView){
        位图快照= NULL;
        可绘制绘制= NULL;
        yourView.setDrawingCacheEnabled(真正的);
        yourView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH); //该snpashot质量
        尝试 {
            快照= Bitmap.createBitmap(yourView.getDrawingCache());
            绘制=新BitmapDrawable(快照);
        } 最后 {
            yourView.setDrawingCacheEnabled(假);
        }
        返回快照;
    }
 

但我正在逐渐 NullPointerException异常以下行:

快照= Bitmap.createBitmap(yourView.getDrawingCache());

下面是的logcat

  09-19 15:39:15.481:E / AndroidRuntime(8704):致命异常:主要
09-19 15:39:15.481:E / AndroidRuntime(8704):显示java.lang.NullPointerException
09-19 15:39:15.481:E / AndroidRuntime(8704):在android.graphics.Bitmap.createBitmap(Bitmap.java:455)
09-19 15:39:15.481:E / AndroidRuntime(8704):在com.scb.bonuspartner.utils.MapUtility.loadBitmapFromView(MapUtility.java:85)
09-19 15:39:15.481:E / AndroidRuntime(8704):在com.scb.bonuspartner.utils.MapUtility.createMarker(MapUtility.java:74)
09-19 15:39:15.481:E / AndroidRuntime(8704):在com.scb.bonuspartner.offeractivity.fragments.MapOfferFragment.onLocationChanged(MapOfferFragment.java:70)
09-19 15:39:15.481:E / AndroidRuntime(8704):在android.location.LocationManager $ ListenerTransport._handleMessage(LocationManager.java:227)
09-19 15:39:15.481:E / AndroidRuntime(8704):在android.location.LocationManager $ ListenerTransport.access $ 000(LocationManager.java:160)
09-19 15:39:15.481:E / AndroidRuntime(8704):在android.location.LocationManager $ ListenerTransport $ 1.handleMessage(LocationManager.java:176)
09-19 15:39:15.481:E / AndroidRuntime(8704):在android.os.Handler.dispatchMessage(Handler.java:99)
09-19 15:39:15.481:E / AndroidRuntime(8704):在android.os.Looper.loop(Looper.java:154)
09-19 15:39:15.481:E / AndroidRuntime(8704):在android.app.ActivityThread.main(ActivityThread.java:4624)
09-19 15:39:15.481:E / AndroidRuntime(8704):在java.lang.reflect.Method.invokeNative(本机方法)
09-19 15:39:15.481:E / AndroidRuntime(8704):在java.lang.reflect.Method.invoke(Method.java:511)
09-19 15:39:15.481:E / AndroidRuntime(8704):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:809)
09-19 15:39:15.481:E / AndroidRuntime(8704):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
09-19 15:39:15.481:E / AndroidRuntime(8704):在dalvik.system.NativeStart.main(本机方法)
 

解决方案

试试这个方法

 私有静态位图loadBitmapFromView(查看yourView){
        位图快照= NULL;
        可绘制绘制= NULL;
        yourView.setDrawingCacheEnabled(真正的);
        yourView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH); //该snpashot质量
        尝试 {
            yourView.buildDrawingCache(); //更新在这里
            快照= Bitmap.createBitmap(yourView.getDrawingCache());
            绘制=新BitmapDrawable(快照);
        } 最后 {
            yourView.setDrawingCacheEnabled(假);
        }
        返回快照;
    }
 

说明:

有关知识位图是final类。因此,它的优先级垃圾收集器(GC)是非常低的,这是非常内存expensive.By默认视图不创建一个从画布上的位图,因为如果它这样做的一个位图会产生记忆每个视图膨胀,它可能会导致buildDrawingCache。因此, buildDrawingCache()方法,因为你可以生成位图时,它是必需的。

I am using the below code for getting a Bitmap from a View :

private static Bitmap loadBitmapFromView(View yourView) {
        Bitmap snapshot = null;
        Drawable drawable = null;
        yourView.setDrawingCacheEnabled(true);
        yourView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH); //Quality of the snpashot
        try {
            snapshot = Bitmap.createBitmap(yourView.getDrawingCache());
            drawable = new BitmapDrawable(snapshot);
        } finally {
            yourView.setDrawingCacheEnabled(false);
        }
        return snapshot;
    }

But I am getting NullPointerException on the following line:

snapshot = Bitmap.createBitmap(yourView.getDrawingCache());

Here is the Logcat:

09-19 15:39:15.481: E/AndroidRuntime(8704): FATAL EXCEPTION: main
09-19 15:39:15.481: E/AndroidRuntime(8704): java.lang.NullPointerException
09-19 15:39:15.481: E/AndroidRuntime(8704):     at android.graphics.Bitmap.createBitmap(Bitmap.java:455)
09-19 15:39:15.481: E/AndroidRuntime(8704):     at com.scb.bonuspartner.utils.MapUtility.loadBitmapFromView(MapUtility.java:85)
09-19 15:39:15.481: E/AndroidRuntime(8704):     at com.scb.bonuspartner.utils.MapUtility.createMarker(MapUtility.java:74)
09-19 15:39:15.481: E/AndroidRuntime(8704):     at com.scb.bonuspartner.offeractivity.fragments.MapOfferFragment.onLocationChanged(MapOfferFragment.java:70)
09-19 15:39:15.481: E/AndroidRuntime(8704):     at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:227)
09-19 15:39:15.481: E/AndroidRuntime(8704):     at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:160)
09-19 15:39:15.481: E/AndroidRuntime(8704):     at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:176)
09-19 15:39:15.481: E/AndroidRuntime(8704):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-19 15:39:15.481: E/AndroidRuntime(8704):     at android.os.Looper.loop(Looper.java:154)
09-19 15:39:15.481: E/AndroidRuntime(8704):     at android.app.ActivityThread.main(ActivityThread.java:4624)
09-19 15:39:15.481: E/AndroidRuntime(8704):     at java.lang.reflect.Method.invokeNative(Native Method)
09-19 15:39:15.481: E/AndroidRuntime(8704):     at java.lang.reflect.Method.invoke(Method.java:511)
09-19 15:39:15.481: E/AndroidRuntime(8704):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
09-19 15:39:15.481: E/AndroidRuntime(8704):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
09-19 15:39:15.481: E/AndroidRuntime(8704):     at dalvik.system.NativeStart.main(Native Method)

解决方案

Try this way

private static Bitmap loadBitmapFromView(View yourView) {
        Bitmap snapshot = null;
        Drawable drawable = null;
        yourView.setDrawingCacheEnabled(true);
        yourView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH); //Quality of the snpashot
        try {
            yourView.buildDrawingCache(); // UPDATE HERE
            snapshot = Bitmap.createBitmap(yourView.getDrawingCache());
            drawable = new BitmapDrawable(snapshot);
        } finally {
            yourView.setDrawingCacheEnabled(false);
        }
        return snapshot;
    }

Explanation :

For the knowledge Bitmap is final class. So it's priority for garbage collector(GC) is very low and it is very memory expensive.By default view does not creates the bitmap from the canvas because if it do so one bitmap will be generate in memory for each view inflated and it may cause buildDrawingCache. So buildDrawingCache() method is given that you can generate the bitmap when it is required.

这篇关于NullPointerException异常的createBitmap()从查看的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆