I have the following thread:
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) {}}
}}
}
I also have the following methods in the same file:
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;
}
On my logic file, I have OnPause and OnResume events as follows:
@Override
protected void onPause() {
mLemonadeMainMenuView.setThreadRunning(false);
super.onPause();
}
@Override
protected void onResume() {
mLemonadeMainMenuView.setThreadRunning(true);
super.onResume();
b=true;
}
The thread works fine normally, however when I exit the app and come back to it, it closes with the following errors:
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)
Here is the DoDraw() method:
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;
}
Follow the stack trace – it tells you the file, the class, the line number where the NPE occurred. Turn on line numbers in your IDE, find that line, and see which of the references you find is nul. Step through in a debugger. It should be easy to find – faster than asking here.