我有以下主題:爲什麼我的線程由於未捕獲的異常而停止?
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;
}
您錯過了唯一需要了解發生了什麼的相關代碼。請包括doDraw方法,正在拋出一個NullPointerException異常。 – 2012-03-27 21:19:43
你如何退出應用程序? – 2012-03-27 21:20:28
我通過後面cutton exitting,DoDraw()已被添加。 – jersam515 2012-03-27 21:22:28