2014-02-24 47 views
0

我想創建一個簡單的背景圖像頂部的圖像大致每30秒更新一次。我使用畫布來完成這個任務,但是當我嘗試在畫布上進行打印時,會拋出一個NPE。據我可以告訴畫布已經初始化。該活動啓動啓動/停止運行繪製方法的線程的視圖。 NPE被拋出的是繪製方法。這是活動的啓動說明了一切:繪製到Android中的畫布拋出空指針異常

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    view = new GameView(this); 
    setContentView(view); 
    view.onCreate(); 
} 

public void onPause() { 
    super.onPause(); 
    view.onPause(); 
} 

public void onResume() { 
    super.onResume(); 
    view.onResume(); 
} 

這些都是我的表面觀的主要功能:

public GameView(Context context) { 
    super(context); 
    getHolder().addCallback(this); 
    setFocusable(true); 
} 

public void onCreate() { 
    _drawThread = new DrawThread(getHolder(), this); 
} 

synchronized public void draw(Canvas canvas) { 
    canvas.getHeight(); //returns NPE 
} 

public void onResume() { 
    if (!_drawThread.isAlive()) { 
     _drawThread.setRunning(true); 
     _drawThread.start(); 
    } else { 
     _drawThread.setRunning(true); 
    } 
} 

public void onPause() { 
    boolean retry = true; 
    _drawThread.setRunning(false); 
    while (retry) { 
     try { 
      _drawThread.join(); 
      retry = false; 
     } catch (InterruptedException e) { 

     } 
    } 
} 

我的拉線的樣子:

public void run() { 
    Canvas c; 
    while (_running) { 
     c = null; 
     try { 
      c = _surfaceHolder.lockCanvas(); 
      synchronized (_surfaceHolder) { 
       _game.draw(c); 
       try { 
        Thread.sleep(500); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     } finally { 
      if (c != null) { 
      _surfaceHolder.unlockCanvasAndPost(c); 
      } 
     } 
    } 
} 

從我可以告訴畫布在創建繪製線程之前不會被初始化,這會導致NPE,但是我看不到代碼有什麼問題。一點幫助或建議會很好。

+0

canvas必須爲null,什麼是_surfaceHolder.lockCanvas()返回? – Sam

回答

0

您需要將自己的SurfaceHolder.CallbackSurfaceHolder.Callback2SurfaceHolder一起註冊,並確保在嘗試繪製表面之前已經創建了曲面。如果您嘗試在創建表面之前鎖定畫布,則無法爲您提供Canvas對象。您通常不需要覆蓋SurfaceView,但只是將其用作訪問您希望繪製的背襯表面的機制。

+0

我有線程設置爲啓動視圖的onResume()並停止onPause(),但onResume()不會發生,直到創建表面之後。如果應用程序已暫停,但如果在表面視圖重新創建之前不啓動,如何防止線程繪製? – MachoChild

+0

好,所以我設置線程在表面創建完成後開始,一旦表面破壞就結束。但是,當畫布被銷燬時線程仍在運行。這導致NPE退出該活動。 – MachoChild

+0

我很困惑你最後的評論。如果在表面被破壞時停止線程,爲什麼線程仍在運行?您正處在正確的軌道上 - 您必須管理什麼時候通過表面感知和生命週期感知來繪製表面。 –