2014-06-13 38 views
0

我有这个问题。 我使用画布绘制字符。Android:NullPointerExceptions当与线程调用功能

@Override 
public void onDraw(Canvas canvas) { 
    this.mcanvas = canvas; 
    mcanvas.drawBitmap(mBg, null, mRect, mPaint); 

    for (int i = temps.size() - 1; i >= 0; i--) { 
     temps.get(i).onDraw(mcanvas); 
    } 
    for (Sprite sprite : sprites) { 
     sprite.onDraw(canvas); 
    } 
    while(timeleft>0) { 
     timeleft=(int) (timeleft-1);  
     score.onDraw(canvas,timeleft); break; 
    } 
} 

当我为这个函数设置drawBitmap并且Thread类运行这个。

@Override 
public void run() { 
    long ticksPS = 1000/FPS; 
    long startTime; 
    long sleepTime; 
    while (running) { 
     Canvas c = null; 
     startTime = System.currentTimeMillis(); 
     try { 
      c = view.getHolder().lockCanvas(); 
      synchronized (view.getHolder()) { 
       view.onDraw(c); 
      } 

     } finally { 
      if (c != null) { 
       view.getHolder().unlockCanvasAndPost(c); 
      } 
     } 
     sleepTime = ticksPS - (System.currentTimeMillis() - startTime); 
     try { 
      if (sleepTime > 0) 
       sleep(sleepTime); 
      else 
       sleep(2); 
     } catch (Exception e) { 
     } 

    } 

} 

但是,当我重玩游戏,logcat显示错误和关闭应用程序。

06-13 02:04:12.347: E/AndroidRuntime(956): FATAL EXCEPTION: Thread-94 
06-13 02:04:12.347: E/AndroidRuntime(956): java.lang.NullPointerException 
06-13 02:04:12.347: E/AndroidRuntime(956): at com.example.Boss.GameView.onDraw(GameView.java:353) 
06-13 02:04:12.347: E/AndroidRuntime(956): at com.example.Boss.GameLoopThread.run(GameLoopThread.java:30) 

它显示了一个错误:

mcanvas.drawBitmap(mBg, null, mRect, mPaint); 

view.onDraw(c); 

我不知道它发生了什么事。我需要帮助。提前致谢!。

回答

0
for (Sprite sprite : sprites) { 
    sprite.onDraw(canvas); 
    } 

尝试使用for循环,而不是,我以前也有崩溃的时候运行foreach循环在游戏的2倍以上,还发布更多细节:

for(int i =0; i< sprites.size(); i++){ 
     Sprite s = sprites.get(i); 
     s.onDraw(canvas); 
    } 
0

的错误似乎是mcanvasnull。当lockCanvas()返回null时可能发生这种情况。请检查的SurfcaeHolder.lockCanvas()它说的文档:如果表面没有被创建或

,则返回null否则不能进行编辑。你通常需要实现Callback.surfaceCreated来找出Surface何时可用。