2013-07-23 76 views
2

我拋出NullPointerException在我的代碼:NullPointerException異常試圖繪製位圖

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

我有一個日誌語句正上方有以確保畫布不爲空。我猜第二個Rect爲空是問題嗎?我認爲可以將它保留爲空。

這裏是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) 
+0

'icon'是'null'?或'rect'是'null'? – Pang

+0

沒有,我是砍伐了 – user1154644

+0

是的,我有記錄所有3個變量 – user1154644

回答

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組件。如果您需要異步獲取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,...); 
    } 

} 
+0

我正在初始化它:rect = new Rect(blx,bly,trx,trx); – user1154644

+0

被更新的唯一UI組件是canvas本身,因爲這是通過在onDraw()中啓動的線程完成的,不應該那麼好嗎? – user1154644

0

通常情況下,我這樣做的方式。我通過線程解碼位圖,並將其放入隊列中。將隊列與UI線程同步。 UI線程從隊列中獲取位圖並繪製它。所有的UI東西應該在UI線程中完成。

0

我有一個空指針例。在 android.view.GLES20RecordingCanvas.drawBitmap

我讀過,你必須在你的onDraw方法(在你的視圖類)裏面做「drawBitmap」。

對我來說,用於觸發的onDraw的invalidate()方法。在調用invalidate()之前,我設置了一些參數給我的對象(視圖類),所以,當調用onDraw時,它使用我放置的參數。

希望工程:)

萊昂納多。

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」中存儲。這解決了我的問題。