2

スレッドを閉じるのに問題があります。onStop、onPause、onDestroyでスレッドを閉じます。これは、アクティビティクラスの私のソースです。

   @Override
protected void onStop(){
   super.onStop();
   finish();
} 

@Override
protected void onPause()  { 
     super.onPause(); 
     finish();
    } 

@Override
public void onDestroy() {
        this.mWakeLock.release();
        super.onDestroy();
}

そしてスレッドクラス:

public class GameThread extends Thread {

private SurfaceHolder mSurfaceHolder;
private Handler mHandler;
private Context mContext;
private Paint mLinePaint;
private Paint blackPaint;

//for consistent rendering
private long sleepTime;
//amount of time to sleep for (in milliseconds)
private long delay=1000/30;
//state of game (Running or Paused).
int state = 1;
public final static int RUNNING = 1;
public final static int PAUSED = 2;
public final static int STOPED = 3;

GameSurface gEngine;

public GameThread(SurfaceHolder surfaceHolder, Context context, Handler handler,GameSurface gEngineS){

    //data about the screen
    mSurfaceHolder = surfaceHolder;
    mHandler = handler;
    mContext = context;
    gEngine=gEngineS;
}

//This is the most important part of the code. It is invoked when the call to start() is
//made from the SurfaceView class. It loops continuously until the game is finished or
//the application is suspended.
private long beforeTime;
@Override
public void run() {

    //UPDATE
    while (state==RUNNING) {
        Log.d("State","Thread is runnig");
        //time before update
        beforeTime = System.nanoTime();
        //This is where we update the game engine
        gEngine.Update();

        //DRAW
        Canvas c = null;
        try {
            //lock canvas so nothing else can use it
            c = mSurfaceHolder.lockCanvas(null);
            synchronized (mSurfaceHolder) {
                //clear the screen with the black painter.
                //reset the canvas
                c.drawColor(Color.BLACK);
                //This is where we draw the game engine.
                gEngine.doDraw(c);
            }
        } finally {
            // do this in a finally so that if an exception is thrown
            // during the above, we don't leave the Surface in an
            // inconsistent state
            if (c != null) {
                mSurfaceHolder.unlockCanvasAndPost(c);
            }
        }



        this.sleepTime = delay-((System.nanoTime()-beforeTime)/1000000L);

        try {
            //actual sleep code
            if(sleepTime>0){
                this.sleep(sleepTime);

            }
        } catch (InterruptedException ex) {
            Logger.getLogger(GameThread.class.getName()).log(Level.SEVERE, null, ex);
        }

        while (state==PAUSED){
            Log.d("State","Thread is pausing");
            try {
                this.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}}

アクティビティクラスからスレッドを閉じるにはどうすればよいですか?

4

1 に答える 1

0

currentState変数を静的変数として定義し、静的関数でアクセスして、状態を変更してスレッドを停止または一時停止することができますが、この種の作業に最も適したAndroidの内部コンポーネントを使用できると思いますあなたが彼らにメッセージを送ることができるサービスのように、それはあなたの活動にメッセージを送り返すことができます、あるいはあなたはあなたにAsyncTaskをすることができます。これを見てください

于 2012-10-20T10:56:30.327 に答える