【问题标题】:NullPointerException trying to draw bitmapNullPointerException 试图绘制位图
【发布时间】:2013-07-23 01:29:31
【问题描述】:

我的代码中抛出了 NullPointerException:

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

我在上面有一个 Log 语句,以确保画布不为空。我猜第二个 Rect 是 null 是问题吗?我认为可以将其保留为 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)

【问题讨论】:

标签: android


【解决方案1】:

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

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

请参考这些链接。它可能会帮助你。 Click Here to see sample 1

Click here to see sample 2

【讨论】:

    【解决方案2】:

    来自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 堆栈跟踪。

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

    new AsyncTask(Void,Void,Bitmap){
    
        protected Bitmap doInBackground(Void... voids){
            //fetch Bitmap
            return bitmap;
        }
    
        protected void onPostExecute(Bitmap bitmap){
            //fetch Bitmap
            canvas.drawBitmap(bitmap,...);
        }
    
    }
    

    【讨论】:

    • 我在上面初始化它:rect = new Rect(blx, bly, trx, trx);
    • 唯一要更新的 ui 组件是画布本身,因为这是通过 onDraw() 中启动的线程完成的,那应该没问题吗?
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      希望它有效:)

      莱昂纳多。

      【讨论】:

        【解决方案5】:
        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”上的局部变量。这解决了我的问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-08
          • 2020-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多