我的游戏在重新开放时崩溃但不是立即崩溃

时间:2017-12-11 09:05:00

标签: java android

我做了很好的搜索并尝试了很多东西,但无论我尝试做什么,只是赢了工作,游戏在启动时运行正常!但是一旦我关闭并重新打开就拒绝运行。它不需要继续,我很高兴它重新启动。崩溃日志告诉我它与我的线程有关。但我真的找不到该死的东西。任何帮助或建议都会很棒。

//游戏线程

import android.graphics.Canvas;
import android.view.SurfaceHolder;

public class GameThread extends Thread {

    private boolean running;
    private GameSurface gameSurface;
    private SurfaceHolder surfaceHolder;
    private Object mPauseLock = new Object();
    private boolean mPaused;

    public GameThread(GameSurface gameSurface, SurfaceHolder surfaceHolder)  {
        this.gameSurface= gameSurface;
        this.surfaceHolder= surfaceHolder;
    }



    @Override
    public void run()  {
        long startTime = System.nanoTime();

        while(running)  {
            Canvas canvas= null;
            try {
                // Get Canvas from Holder and lock it.
                canvas = this.surfaceHolder.lockCanvas();

                // Synchronized
                synchronized (canvas)  {
                    this.gameSurface.update();
                    this.gameSurface.draw(canvas);
                }
            }catch(Exception e)  {
                // Do nothing.
            } finally {
                if(canvas!= null)  {
                    // Unlock Canvas.
                    this.surfaceHolder.unlockCanvasAndPost(canvas);
                }
            }

            long now = System.nanoTime() ;
            // Interval to redraw game
            // (Change nanoseconds to milliseconds)
            long waitTime = (now - startTime)/1000000;
            if(waitTime < 10)  {
                waitTime= 10; // Millisecond.
            }
            System.out.print(" Wait Time="+ waitTime);

            try {
                // Sleep.
                this.sleep(waitTime);
            } catch(InterruptedException e)  {

            }

            synchronized (mPauseLock) {
                while (mPaused) {
                    try {
                        mPauseLock.wait();
                    } catch (InterruptedException e){

                    }
                }
            }
            startTime = System.nanoTime();
            System.out.print(".");
        }
    }

    public void onPause() {
        synchronized (mPauseLock) {
            mPaused = true;
        }
    }

    public void onResume() {
        synchronized (mPauseLock) {
            mPaused = false;
            mPauseLock.notifyAll();
        }
    }


    public void setRunning(boolean running)  {
        this.running= running;
    }
}

// GameSurface

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Handler;
import android.os.Message;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class GameSurface extends SurfaceView implements SurfaceHolder.Callback {

    private GameThread gameThread;
    private Player player;
    private boolean mGameIsRunning;

    public GameSurface(Context context)  {
        super(context);

        // Make Game Surface focusable so it can handle events. .
        this.setFocusable(true);

        // Sét callback.
        this.getHolder().addCallback(this);
    }

    public void update()  {
        this.player.update();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int x = (int)event.getX();
        int y = (int)event.getY();

        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            player.setActionDown();
            int movingVectorX =x-  this.player.getX() ;
            int movingVectorY =y-  this.player.getY() ;
            this.player.setMovingVector(movingVectorX,movingVectorY);
            Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                public void run() {
                    player.setactionUp();
                }
            }, 100);
            return true;
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            player.setactionUp();
        }
        return false;
    }


    @Override
    public void draw(Canvas canvas)  {
        super.draw(canvas);
        canvas.drawColor(Color.parseColor("#eeeeee"));
        this.player.draw(canvas);
    }

    // Implements method of SurfaceHolder.Callback
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        Bitmap playerbitmap = BitmapFactory.decodeResource(this.getResources(),R.drawable.player);
        this.player = new Player(this,playerbitmap,100,50);

        this.gameThread = new GameThread(this,holder);

        if (gameThread.getState() == Thread.State.TIMED_WAITING) {
            gameThread.setRunning(false);
        } else if (gameThread.getState() == Thread.State.TERMINATED) {
            gameThread.setRunning(false);
        } else {
            this.gameThread.setRunning(true);
            this.gameThread.start();
            start();
        }
    }

    public void start() {
        if(!mGameIsRunning) {
            gameThread.start();
            mGameIsRunning = true;
        } else {
            gameThread.onResume();
        }
    }

    // Implements method of SurfaceHolder.Callback
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    // Implements method of SurfaceHolder.Callback
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        boolean retry= true;
        while(retry) {
            try {
                this.gameThread.setRunning(false);

                // Parent thread must wait until the end of GameThread.
                this.gameThread.join();
            }catch(InterruptedException e)  {
                e.printStackTrace();
            }
            retry= true;
        }
    }

}

if (gameThread.getState() == Thread.State.TIMED_WAITING) {
            gameThread.setRunning(false);
        } else if (gameThread.getState() == Thread.State.TERMINATED) {
            gameThread.setRunning(false);
        } else {
            this.gameThread.setRunning(true);
            this.gameThread.start();
            start();
        }

是我尝试让它发挥作用的最后一次尝试。我不知道自己做错了什么。感谢您提前提供任何帮助。

//记录:

12-11 07:10:39.631 E/AndroidRuntime(6488): FATAL EXCEPTION: Thread-2
12-11 07:10:39.631 E/AndroidRuntime(6488): Process: archtectsproductions.endlessrunner, PID: 6488
12-11 07:10:39.631 E/AndroidRuntime(6488): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Canvas.drawColor(int)' on a null object reference
12-11 07:10:39.631 E/AndroidRuntime(6488):  at archtectsproductions.endlessrunner.GameView.onDraw(GameView.java:67)
12-11 07:10:39.631 E/AndroidRuntime(6488):  at archtectsproductions.endlessrunner.GameLoopThread.run(GameLoopThread.java:28)
12-11 07:10:41.250 E/AndroidRuntime(6515): FATAL EXCEPTION: Thread-2
12-11 07:10:41.250 E/AndroidRuntime(6515): Process: archtectsproductions.endlessrunner, PID: 6515
12-11 07:10:41.250 E/AndroidRuntime(6515): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Canvas.drawColor(int)' on a null object reference
12-11 07:10:41.250 E/AndroidRuntime(6515):  at archtectsproductions.endlessrunner.GameView.onDraw(GameView.java:67)
12-11 07:10:41.250 E/AndroidRuntime(6515):  at archtectsproductions.endlessrunner.GameLoopThread.run(GameLoopThread.java:28)
12-11 07:10:48.881 E/AndroidRuntime(6573): FATAL EXCEPTION: Thread-2
12-11 07:10:48.881 E/AndroidRuntime(6573): Process: archtectsproductions.endlessrunner, PID: 6573
12-11 07:10:48.881 E/AndroidRuntime(6573): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Canvas.drawColor(int)' on a null object reference
12-11 07:10:48.881 E/AndroidRuntime(6573):  at archtectsproductions.endlessrunner.GameView.onDraw(GameView.java:67)
12-11 07:10:48.881 E/AndroidRuntime(6573):  at archtectsproductions.endlessrunner.GameLoopThread.run(GameLoopThread.java:28)
12-11 08:06:05.357 E/AndroidRuntime(9121): FATAL EXCEPTION: Thread-2
12-11 08:06:05.357 E/AndroidRuntime(9121): Process: archtectsproductions.myapplication, PID: 9121
12-11 08:06:05.357 E/AndroidRuntime(9121): java.lang.NullPointerException: Attempt to invoke virtual method 'void android.graphics.Canvas.drawColor(int)' on a null object reference
12-11 08:06:05.357 E/AndroidRuntime(9121):  at archtectsproductions.myapplication.GameView.onDraw(GameView.java:84)
12-11 08:06:05.357 E/AndroidRuntime(9121):  at archtectsproductions.myapplication.GameLoopThread.run(GameLoopThread.java:28)
12-11 08:32:09.819 E/AndroidRuntime(12015): FATAL EXCEPTION: Thread-2
12-11 08:32:09.819 E/AndroidRuntime(12015): Process: archtectsproductions.walkingtest, PID: 12015
12-11 08:32:09.819 E/AndroidRuntime(12015): java.lang.AssertionError: Attempt to repark
12-11 08:32:09.819 E/AndroidRuntime(12015):     at java.lang.Thread.parkFor$(Thread.java:2143)
12-11 08:32:09.819 E/AndroidRuntime(12015):     at sun.misc.Unsafe.park(Unsafe.java:325)
12-11 08:32:09.819 E/AndroidRuntime(12015):     at java.util.concurrent.locks.LockSupport.park(LockSupport.java:161)
12-11 08:32:09.819 E/AndroidRuntime(12015):     at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:840)
12-11 08:32:09.819 E/AndroidRuntime(12015):     at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:873)
12-11 08:32:09.819 E/AndroidRuntime(12015):     at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1197)
12-11 08:32:09.819 E/AndroidRuntime(12015):     at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:185)
12-11 08:32:09.819 E/AndroidRuntime(12015):     at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:262)
12-11 08:32:09.819 E/AndroidRuntime(12015):     at android.view.SurfaceView$4.internalLockCanvas(SurfaceView.java:999)
12-11 08:32:09.819 E/AndroidRuntime(12015):     at android.view.SurfaceView$4.lockCanvas(SurfaceView.java:975)
12-11 08:32:09.819 E/AndroidRuntime(12015):     at archtectsproductions.walkingtest.GameThread.run(GameThread.java:31)
12-11 08:50:28.534 E/AndroidRuntime(14071): FATAL EXCEPTION: main
12-11 08:50:28.534 E/AndroidRuntime(14071): Process: archtectsproductions.walkingtest, PID: 14071
12-11 08:50:28.534 E/AndroidRuntime(14071): java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Thread$State java.lang.Thread.getState()' on a null object reference
12-11 08:50:28.534 E/AndroidRuntime(14071):     at archtectsproductions.walkingtest.GameSurface.surfaceCreated(GameSurface.java:68)
12-11 08:50:28.534 E/AndroidRuntime(14071):     at android.view.SurfaceView.updateWindow(SurfaceView.java:632)
12-11 08:50:28.534 E/AndroidRuntime(14071):     at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:162)
12-11 08:50:28.534 E/AndroidRuntime(14071):     at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944)
12-11 08:50:28.534 E/AndroidRuntime(14071):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2239)
12-11 08:50:28.534 E/AndroidRuntime(14071):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1280)
12-11 08:50:28.534 E/AndroidRuntime(14071):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6432)
12-11 08:50:28.534 E/AndroidRuntime(14071):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
12-11 08:50:28.534 E/AndroidRuntime(14071):     at android.view.Choreographer.doCallbacks(Choreographer.java:686)
12-11 08:50:28.534 E/AndroidRuntime(14071):     at android.view.Choreographer.doFrame(Choreographer.java:621)
12-11 08:50:28.534 E/AndroidRuntime(14071):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860)
12-11 08:50:28.534 E/AndroidRuntime(14071):     at android.os.Handler.handleCallback(Handler.java:751)
12-11 08:50:28.534 E/AndroidRuntime(14071):     at android.os.Handler.dispatchMessage(Handler.java:95)
12-11 08:50:28.534 E/AndroidRuntime(14071):     at android.os.Looper.loop(Looper.java:154)
12-11 08:50:28.534 E/AndroidRuntime(14071):     at android.app.ActivityThread.main(ActivityThread.java:6321)
12-11 08:50:28.534 E/AndroidRuntime(14071):     at java.lang.reflect.Method.invoke(Native Method)
12-11 08:50:28.534 E/AndroidRuntime(14071):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
12-11 08:50:28.534 E/AndroidRuntime(14071):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
12-11 09:41:56.793 D/AndroidRuntime(19572): >>>>>> START com.android.internal.os.RuntimeInit uid 0 <<<<<<
12-11 09:41:56.795 D/AndroidRuntime(19572): CheckJNI is OFF
12-11 09:41:56.906 D/AndroidRuntime(19572): Calling main entry com.android.commands.am.Am
12-11 09:41:56.917 D/AndroidRuntime(19572): Shutting down VM
12-11 09:41:57.187 D/AndroidRuntime(19586): >>>>>> START com.android.internal.os.RuntimeInit uid 0 <<<<<<
12-11 09:41:57.189 D/AndroidRuntime(19586): CheckJNI is OFF
12-11 09:41:57.315 D/AndroidRuntime(19586): Calling main entry com.android.commands.am.Am

0 个答案:

没有答案
相关问题