2012-03-27 105 views
1

我有以下主题:为什么我的线程由于未捕获的异常而停止?

class LemonadeMainMenuThread extends Thread { 

    private SurfaceHolder mSurfaceHolder; 
    private Handler mHandler; 
    private Context mContext; 
    int mRowId = 0; 

    public void setRunning(boolean b) { 
     mRun = b; 
    } 

    public LemonadeMainMenuThread(SurfaceHolder surfaceHolder, 
      Context context, Handler handler) { 
     mSurfaceHolder = surfaceHolder; 
     mHandler = handler; 
     mContext = context; 
    } 

    Resources res = getResources(); 

    @Override 
    public void run() { 
     while(1==1) 
     { 
     if (mRun) { 
      try { 
       c = mSurfaceHolder.lockCanvas(null); 
       synchronized (mSurfaceHolder) { 
        doDraw(c); 

       } 
      } finally { 
       if (c != null) { 
        mSurfaceHolder.unlockCanvasAndPost(c); 
       } 
      } 

     } 
     else{try { Thread.sleep(100); } catch (Exception ie) {}} 
    }} 

} 

我也有在同一个文件下面的方法:

public void surfaceCreated(SurfaceHolder arg0) { 
    if (thread.getState() == Thread.State.TERMINATED) { 
     thread = new LemonadeMainMenuThread(holder, ctx, new Handler() { 
      @Override 
      public void handleMessage(Message m) { 
      } 
     }); 
    } 
    thread.setRunning(true); 
    thread.start(); 
} 
public LemonadeMainMenuThread setThreadRunning(boolean b) { 
    mRun = b; 
    if (thread.getState() == Thread.State.TERMINATED) { 
     thread = new LemonadeMainMenuThread(holder, ctx, new Handler() { 
      @Override 
      public void handleMessage(Message m) { 
      } 
     }); 
    } 
    return thread; 
} 

在我的逻辑文件,我的onPause和的onResume事件如下:

@Override 
protected void onPause() { 
    mLemonadeMainMenuView.setThreadRunning(false); 
    super.onPause(); 
} 

@Override 
protected void onResume() { 
    mLemonadeMainMenuView.setThreadRunning(true); 
    super.onResume(); 
    b=true; 
} 

线程工作正常正常,但是当我退出程序,回来时,关闭与以下错误:

FATAL EXCEPTION: Thread-13 
03-27 
java.lang.NullPointerException 
03-27 
at com.example.HelloAndroid.LemonadeMainMenuView$LemonadeMainMenuThread.doDraw(LemonadeMainMenuView.java:106) 

at com.example.HelloAndroid.LemonadeMainMenuView$LemonadeMainMenuThread.run(LemonadeMainMenuView.java:72) 

这里是DoDraw()方法:

private void doDraw(Canvas canvas) { 
     canvas.drawColor(Color.BLACK); 
     Paint p = new Paint(); 
     p.setColor(Color.RED); 
     p.setStyle(Style.FILL); 
     Paint p3 = new Paint(); 
     p3.setColor(Color.GREEN); 
     p3.setStyle(Style.FILL); 
     Paint p2 = new Paint(); 
     p2.setColor(Color.MAGENTA); 
     p2.setStyle(Style.FILL); 
     Paint paint = new Paint(); 
     paint.setColor(Color.TRANSPARENT); 
     paint.setStyle(Style.FILL); 

     canvas.drawBitmap(mFrog, mx, my, null); 
     canvas.drawRect(0, height * 4/5, width, height, p); 
     int fly=0; 
     while(fly<5) 
     { 
     fly++; 
     int xer=flyserd[(fly-1)*2]; 
     int yer=flyserd[((fly-1)*2)+1]; 
     canvas.drawCircle(xer, yer, 10, p3); 
     } 
     fly=0; 
     if (clicked) { 
      if (stages == 0) { 
       stages = (int) (Math.sqrt(Math.pow(MouthX + mx + x + clickx 
         + x/2, 2) 
         + Math.pow(MouthY + my + y + clicky + y/2, 2)) 
         * height/40000); 
       stages += 1; 
      } 

      if (systemtime + 10 < System.currentTimeMillis()) { 
       systemtime = System.currentTimeMillis(); 
       if (stage < stages) { 
        stage++; 
        canvas.drawLine(MouthX + mx, MouthY + my, 
          ((clickx - (MouthX + mx)) * stage/stages) 
            + MouthX + mx, 
          ((clicky - (MouthY + my)) * stage/stages) 
            + MouthY + my, p2); 
        if (stage == stages) { 
         stage = 0; 
         stages = 0; 
         clicked = false; 
        } 
       } 
      } 
     } 
     b = false; 
    } 
+0

您错过了唯一需要了解发生了什么的相关代码。请包括doDraw方法,正在抛出一个NullPointerException异常。 – 2012-03-27 21:19:43

+0

你如何退出应用程序? – 2012-03-27 21:20:28

+0

我通过后面cutton exitting,DoDraw()已被添加。 – jersam515 2012-03-27 21:22:28

回答

2

跟踪堆栈跟踪 - 它会告诉您文件,类,NPE发生的行号。在IDE中打开行号,找到该行,并查看您找到的哪些引用是nul。在调试器中逐步完成。应该很容易找到 - 比在这里要求更快。

1

我认为你的画布获得与该活动一起被毁坏了,当你按返回键

试试这个

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
     moveTaskToBack(true); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 
相关问题