2017-04-14 33 views
-2
04-14 12:04:30.971 1639-1938/system_process I/WindowManager: Destroying surface Surface(name=Media:com.android.wallpaper.livepicker/com.android.wallpaper.livepicker.LiveWallpaperChange) called by com.android.server.wm.WindowStateAnimator.destroySurface:2014 com.android.server.wm.WindowStateAnimator.destroySurfaceLocked:881 com.android.server.wm.WindowState.removeLocked:1449 com.android.server.wm.WindowManagerService.removeWindowInnerLocked:2478 com.android.server.wm.WindowManagerService.removeWindowLocked:2436 com.android.server.wm.WindowManagerService.removeWindowLocked:2305 com.android.server.wm.WindowManagerService.removeWindow:2300 com.android.server.wm.Session.remove:193 
04-14 12:04:30.990 3852-3852/tianranwang.livewallpaper D/MainService: dispose 
04-14 12:04:31.018 1639-1990/system_process I/WindowManager: Destroying surface Surface(name=tianranwang.livewallpaper.MainService) called by com.android.server.wm.WindowStateAnimator.destroySurface:2014 com.android.server.wm.WindowStateAnimator.destroySurfaceLocked:881 com.android.server.wm.WindowState.removeLocked:1449 com.android.server.wm.WindowManagerService.removeWindowInnerLocked:2478 com.android.server.wm.WindowManagerService.removeWindowLocked:2436 com.android.server.wm.WindowManagerService.removeWindowLocked:2305 com.android.server.wm.WindowManagerService.removeWindow:2300 com.android.server.wm.Session.remove:193 

      --------- beginning of crash 
04-14 12:04:31.020 3852-4240/tianranwang.livewallpaper E/AndroidRuntime: FATAL EXCEPTION: Animation Thread 
      Process: tianranwang.livewallpaper, PID: 3852 
      java.lang.NullPointerException: Attempt to invoke interface method 'void android.view.SurfaceHolder.unlockCanvasAndPost(android.graphics.Canvas)' on a null object reference 
       at processing.a2d.PGraphicsAndroid2D.endDraw(Unknown Source) 
       at processing.core.PApplet.handleDraw(Unknown Source) 
       at processing.core.PSurfaceNone.callDraw(Unknown Source) 
       at processing.core.PSurfaceNone$AnimationThread.run(Unknown Source) 

在界面中的「設置壁紙」,我旋轉屏幕和草圖(繪畫動態壁紙)重新啓動,應用程序墜毀(並不總是崩潰),和素描(動態壁紙)保持在背景上運行..Android動態Wallpaer崩潰(空指針異常,畫布是一個空對象),但我找不到在哪裏

有人可以給我一個提示嗎?提前致謝。


的源代碼,即我已經在processing.a2d.PGraphicsAndroid2D.endDraw()

https://github.com/processing/processing-android/tree/master/core/src/processing

public void endDraw() { 
    if (bitmap == null) return; 

    // hm, mark pixels as changed, because this will instantly do a full 
    // copy of all the pixels to the surface.. so that's kind of a mess. 
    //updatePixels(); 

// if (primaryGraphics) { 
//  if (canvas != null) { 
//  parent.getSurfaceHolder().unlockCanvasAndPost(canvas); 
//  } 
// } 

    if (primaryGraphics) { 
     SurfaceHolder holder = parent.getSurface().getSurfaceHolder(); 
     if (holder != null) { 
     Canvas screen = null; 
     try { 
      screen = holder.lockCanvas(null); 
      if (screen != null) { 
      screen.drawBitmap(bitmap, new Matrix(), null); 
      } 
     } finally { 
      if (screen != null) { 
      try { 
       holder.unlockCanvasAndPost(screen); 
      } catch (IllegalStateException ex) { 
      } 
      } 
     } 
     } 
    } else { 
     // TODO this is probably overkill for most tasks... 
     loadPixels(); 
    } 

    // Marking as modified, and then calling updatePixels() in 
    // the super class, which just sets the mx1, my1, mx2, my2 
    // coordinates of the modified area. This avoids doing the 
    // full copy of the pixels to the surface in this.updatePixels(). 
    setModified(); 
    super.updatePixels(); 
    } 

發現上面的代碼可能會導致此的NullPointerException。


我現在沒有這個問題,因爲我更新處理庫的新版本..而上面的代碼是從新版本的lib。 (我看不到舊版本的代碼)

+0

如何設置在Android Studio中斷點,當這個NullPointerException異常在動畫線程被拋出? – TrW236

+0

我現在沒有這個問題,因爲我更新處理庫的新版本.. – TrW236

回答

0

問題很明顯,您指向的是空對象引用,即'void android.view.SurfaceHolder.unlockCanvasAndPost(android.graphics.Canvas)'的實例尚未創建,但您正試圖獲取它,因此引發錯誤。

java.lang.NullPointerException: Attempt to invoke interface method 'void android.view.SurfaceHolder.unlockCanvasAndPost(android.graphics.Canvas)' on a null object reference 

可以回溯哪裏該類的實例被創建,以獲得墜毀

+0

我明白這個問題。 但我的問題是,這個異常does not說代碼行(代碼導致崩潰) – TrW236

+0

你回溯它,並檢查你在哪裏使用該類的實例 –

+0

所以我不能調試它..因爲我不' t知道我的代碼在哪裏有問題.. – TrW236

0

什麼是一個空指針?

空指針是Java中非常常見的異常。當您嘗試撥打尚未啓動的實例時會發生這種情況。這適用於:

Canvas c; 
c.drawRect(...); 

這基本上就是你在做什麼。所有雖然你的代碼可能會有所不同(這可能也是涉及到線程

之前您發掘併發布你必須鎖定畫布就像這樣:。

Canvas canvas = sf.lockCanvas(); 

畫布說本身,而SF是SurfaceView 。SurfaceView可以與任何視圖(View,SUrfaceView等),因此,如果您添加上面的行更換。

,你會做畫布是一個參考,而不是空的,異常會被解決


更改此:

screen = holder.lockCanvas(null); 

這個

screen = holder.lockCanvas(); 
+0

你知道嗎如何在動畫線程中拋出NullPointerException異常時在android studio中設置斷點? – TrW236

+0

用鼠標右鍵單擊一邊,然後按「顯示數字」(< - 可選。用於知道按下哪個點(參考點))。然後,您左鍵單擊要添加斷點的線。 – Zoe

+0

我已經上傳代碼,我認爲這是可疑的空指針異常 – TrW236