Android中的线程问题

时间:2010-06-27 19:05:17

标签: java android multithreading compatibility

我正在为Android平台制作一个简单的2D游戏,它在2.0及以上版本中运行良好,但在1.6设备上进行测试时,它会立即崩溃。在运行调试器时,我似乎在线程类中得到一个空指针异常。我只是想知道是否有人对问题的位置有任何想法。

这是线程类的代码:

package com.marcusortiz.burnination;

import android.graphics.Canvas;
import android.view.SurfaceHolder;

public class GameThread extends Thread
{
  private SurfaceHolder sHolder;
  private MainView panel;
  private boolean isRunning;

  public GameThread(SurfaceHolder sHolder, MainView panel)
  {
    this.sHolder = sHolder;
    this.panel = panel;
  }

  public void setRunning(boolean isRunning)
  {
    this.isRunning = isRunning;
  }

  public SurfaceHolder getSurfaceHolder()
  {
    return sHolder;
  }

  @Override
  public void run()
  {
    Canvas canvas;
    while(isRunning)
    {
      canvas = null;
      try
      {
        canvas = sHolder.lockCanvas(null);
        synchronized(sHolder)
        {
          for(Sprite s : panel.getSprites())
          {
            s.update();
          }
          panel.onDraw(canvas);
        }
      }
      finally
      {
        if(canvas != null)
        {
          sHolder.unlockCanvasAndPost(canvas);
        }
      }
    }
  }
}

也许这个代码存在一些我不知道的兼容性问题 - 在使用线程时我是一个初学者。

编辑:这是请求的堆栈跟踪

burnination [Android Application]   
  DalvikVM[localhost:8608]  
    Thread [<3> main] (Running) 
    Thread [<15> Binder Thread #3] (Running)    
    Thread [<13> Binder Thread #2] (Running)    
    Thread [<11> Binder Thread #1] (Running)    
    Thread [<17> Thread-9] (Suspended (exception NullPointerException)) 
      GameThread.run() line: 53 

3 个答案:

答案 0 :(得分:1)

这不是堆栈跟踪,但看起来问题出现在第53行,这正是我试图得到的。看起来你发布的代码可能并不完全与你正在运行的代码完全相同,因为第53行是一个右大括号。该行上可能存在一个变量为null的变量。

答案 1 :(得分:0)

我给你一些建议。 1.找出崩溃所在的哪条线。 2.检查SDK(1.6和2.0)源代码中API的不同之处。 如果您可以使用Android 2.0,那么我认为您的代码不存在问题。

答案 2 :(得分:0)

默认情况下,大多数调试器(包括Eclipse)仅在“未捕获”异常时中断。它们不会破坏“捕获”异常,即任何“捕获”块适用的异常。你的“finally”块在这里充当了一个包罗万象,因为它包含了即使抛出异常也必须执行的代码。

当“try”块中的函数抛出NullPointerException时,调试器不会停止,因为它是您可能试图忽略的“捕获”异常。执行“finally”块中的代码,然后重新抛出异常。这次没有人能抓住它,所以Eclipse停了下来。你只是指着“终结”区块的右大括号,因为那是重新投掷的地方。

如果为捕获+未捕获的NullPointerException配置调试断点,您将在抛出点看到失败。另外,如果你让它继续并让线程死掉,你应该看到Android默认的未捕获异常处理程序的logcat输出,指示了抛出点。