【问题标题】:NullPointerException in createBitmap() from View视图中的 createBitmap() 中的 NullPointerException
【发布时间】:2013-09-19 09:59:08
【问题描述】:

我正在使用以下代码从View 获取Bitmap

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;
    }

但我在以下行收到NullPointerException

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

这里是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)

【问题讨论】:

  • 请附上logcat日志
  • 那么空指针是yourView.getDrawingCache?尝试输出 yourView 以查看它是否也为空。在方法的开头检查它。
  • 您是否导入了正确的位图库?另外,你检查过这个答案吗:stackoverflow.com/questions/7644288/…
  • @JackalopeZero 视图存在,不是null

标签: android view nullpointerexception drawable


【解决方案1】:

试试这个方法

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;
    }

说明:

知识位图是最终类。所以 garbage collector(GC) 的优先级很低,而且内存非常昂贵。默认情况下,视图不会从画布创建位图,因为如果这样做,将在内存中生成一个位图每个视图都膨胀了,它可能会导致 buildDrawingCache。所以给出了buildDrawingCache() 方法,您可以在需要时生成位图。

【讨论】:

  • yourView.buildDrawingCache();正在为我工​​作,但你能解释一下吗?
  • @Dhamodharan 我已经添加了解释来回答,请立即查看
【解决方案2】:

代码应该是

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

因为您已经将快照作为位图投射到那里

Bitmap snapshot = null;

?

【讨论】:

  • @JackalopeZero:没有。 createBitmap 是 Bitmap 类的静态方法。它可以在实例上调用,但不建议这样做,尤其是在这种情况下,因为此时快照为空,这将导致另一个 NPE。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 2013-11-21
  • 1970-01-01
  • 2014-07-02
  • 2014-05-03
  • 1970-01-01
相关资源
最近更新 更多