2012-03-27 42 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); 
} 
相關問題