2

我的代码中抛出了 NullPointerException:

canvas.drawBitmap(icon, null, rect, null);

我在上面有一个 Log 语句,以确保画布不为空。我猜第二个 Rect 是 null 是问题吗?我认为可以将其保留为空。

这是 logCat 输出:

07-22 21:34:16.807: E/AndroidRuntime(19340): FATAL EXCEPTION: Thread-3384
07-22 21:34:16.807: E/AndroidRuntime(19340): java.lang.NullPointerException
07-22 21:34:16.807: E/AndroidRuntime(19340):    at
android.view.GLES20RecordingCanvas.drawBitmap(GLES20RecordingCanvas.java:118)
07-22 21:34:16.807: E/AndroidRuntime(19340):    at   
com.live.LedgeView$DrawLedgeThread.run(LedgeView.java:88)
4

5 回答 5

1

是的。请确保“icon”位图不为空且“rect”也不为空,

 Bitmap icon= BitmapFactory.decodeResource(getResources(),
                            R.drawable.icon);

请参考这些链接。它可能会帮助你。 点击这里查看示例 1

点击这里查看示例 2

于 2013-07-23T05:22:24.860 回答
0

来自Android源代码:

public void drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint) {
    if (dst == null) {
        throw new NullPointerException();
    }
    throwIfRecycled(bitmap);
    native_drawBitmap(mNativeCanvas, bitmap.ni(), src, dst,
                      aint != null ? paint.mNativePaint : 0,
                      mScreenDensity, bitmap.mDensity);
}

所以......你确定dst不为空吗?

无论如何发布 logcat 堆栈跟踪。

编辑:响应您的评论之一,切勿从 UI 线程外部更新 UI 组件。AsyncTask如果您需要Bitmap异步获取,请使用。

new AsyncTask(Void,Void,Bitmap){

    protected Bitmap doInBackground(Void... voids){
        //fetch Bitmap
        return bitmap;
    }

    protected void onPostExecute(Bitmap bitmap){
        //fetch Bitmap
        canvas.drawBitmap(bitmap,...);
    }

}
于 2013-07-23T01:39:11.860 回答
0

我有一个空指针 Ex。在 android.view.GLES20RecordingCanvas.drawBitmap

我读到您必须在 onDraw 方法中(在您的视图类中)执行“drawBitmap”。

对我来说,我使用了 invalidate() 方法来触发 onDraw。在调用 invalidate() 之前,我为我的对象(视图类)设置了一些参数,因此,当调用 onDraw 时,它使用我输入的参数。

希望它有效:)

莱昂纳多。

于 2014-05-08T19:54:09.917 回答
0
public void drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint) {
    if (dst == null) {
        throw new NullPointerException();
    }
    throwIfRecycled(bitmap);
    native_drawBitmap(mNativeCanvas, bitmap.ni(), src, dst,
            aint != null ? paint.mNativePaint : 0, mScreenDensity,
            bitmap.mDensity);
}

我通过在发送到该方法之前检查 dst 是否为空来解决此问题。如果 dst 为空,我使用了每次都存储在方法“onBoundsChange”上的局部变量。这解决了我的问题。

于 2014-09-05T08:43:52.783 回答
0

通常,我这样做。我通过线程解码位图,并将其放入队列中。将队列与 UI 线程同步。UI 线程从队列中获取位图,并绘制它。所有 UI 的东西都应该在 UI 线程中完成。

于 2013-07-23T02:02:50.870 回答