【问题标题】:Error, if hide canvas-game错误,如果隐藏画布游戏
【发布时间】:2015-12-24 09:29:00
【问题描述】:
public class GameView extends SurfaceView
{
    private GameThread mThread;
    SurfaceHolder holder;
    Bitmap fon = BitmapFactory.decodeResource(getResources(), R.drawable.fon);
    ArrayList<Integer> lasers = new ArrayList<Integer>();
    ArrayList<Integer> coordYlasers = new ArrayList<Integer>();
    ArrayList<Integer> coordXlasers = new ArrayList<Integer>();
    Bitmap laser = BitmapFactory.decodeResource(getResources(), R.drawable.laser);
    int touchX = 0;
    int touchY = 0;
    int coordX = 0;
    int coordY = 600;
    int _coordX = 0;
    private boolean running = false;
    ArrayList<Bitmap> blocks = new ArrayList<Bitmap>();
    public class GameThread extends Thread
    {
        private GameView view;

        public GameThread(GameView view)
        {
            this.view = view;
        }

        public void setRunning(boolean run)
        {
            running = run;
        }

        public void run()
        {
            int i = 0;
            while (running)
            {
                Canvas canvas = null;
                try
                {
                    canvas = view.getHolder().lockCanvas();
                    synchronized (view.getHolder())
                    {
                        onDraw(canvas);
                    }

                }
                catch (Exception e) { }
                finally
                {
                    if (canvas != null)
                    {
                        view.getHolder().unlockCanvasAndPost(canvas);
                    }
                }
            }
        }
    }
    public GameView(Context context)
    {
        super(context);

        mThread = new GameThread(this);
        getHolder().addCallback(new SurfaceHolder.Callback() {
            public void surfaceDestroyed(SurfaceHolder holder) {
                boolean retry = true;
                mThread.setRunning(false);
                while (retry) {
                    try {
                        mThread.join();
                        retry = false;
                    } catch (InterruptedException e) {
                    }
                }
            }

            public void surfaceCreated(SurfaceHolder holder) {
                mThread.setRunning(true);
                mThread.start();

            }

            public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            }
        });
    }
    public boolean onTouchEvent(MotionEvent event)
    {
        if(event.getAction() == MotionEvent.ACTION_DOWN)
        {
            _coordX = coordX;
            X = (int) event.getX();
            Y = (int) event.getY();

        }
        if(event.getAction() == MotionEvent.ACTION_MOVE)
        {
            touchX = ((int) event.getX());
            touchY = (int) event.getY();
            //if (Math.abs(touchX - X) > 10){
            coordX = _coordX + (touchX - X);
            invalidate();

            //}
        }
        if(event.getAction() == MotionEvent.ACTION_UP)
        {
            _coordX = coordX;
            Y = touchY;
        }
        return true;
    }
    protected void onDraw(Canvas canvas) {
        Paint paint = new Paint();
        paint.setColor(Color.WHITE);
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.RED);
        paint.setTextSize(20);

        canvas.drawColor(Color.WHITE);
        canvas.drawBitmap(fon, 0, 0, null);
        canvas.drawBitmap(player, coordX, coordY, null);
        canvas.drawBitmap(laser, coordLaserX, coordLaserY, null);
        for (int i = 1; i<coordYlasers.size(); ++i){
            canvas.drawBitmap(laser, coordXlasers.get(i), coordYlasers.get(i), null);
        }
        canvas.drawText("" + V, 10, 25, paint);
    }

}

应用程序运行良好,但是.... 如果我隐藏应用程序,游戏会崩溃。请帮忙。

Logcat 错误。

5553-5553/com.example.thetronuo.pregame E/AndroidRuntime﹕ 致命 例外:主要 java.lang.IllegalThreadStateException:线程已经启动。 在 java.lang.Thread.start(Thread.java:1045) 在 com.example.thetronuo.pregame.GameView$1.surfaceCreated(GameView.java:161) 在 android.view.SurfaceView.updateWindow(SurfaceView.java:569) 在 android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:231) 在 android.view.View.dispatchWindowVisibilityChanged(View.java:7618) 在 android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1039) 在 android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1039) 在 android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:1039) 在 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1211) 在 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989) 在 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4356) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:749) 在 android.view.Choreographer.doCallbacks(Choreographer.java:562) 在 android.view.Choreographer.doFrame(Choreographer.java:532) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735) 在 android.os.Handler.handleCallback(Handler.java:725) 在 android.os.Handler.dispatchMessage(Handler.java:92) 在 android.os.Looper.loop(Looper.java:137) 在 android.app.ActivityThread.main(ActivityThread.java:5099) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:511) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:803) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:570) 在 dalvik.system.NativeStart.main(本机方法) 这是活动。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(new GameView(this));
}

“wait()” - 未处理的异常。
在哪里写“resumeThread()”?

public class GameThread extends Thread
        {
            private GameView view;
            private boolean pause = false;

            private synchronized void check(){
                while(pause){
                    wait();
                }
            }

            public void pauseThread(){
                pause = true;
            }

            public void resumeThread(){
                pause = false;
                notify();
            }
            public GameThread(GameView view)
            {
                this.view = view;
            }

【问题讨论】:

    标签: java android multithreading canvas


    【解决方案1】:

    我想我有同样的问题。但我修好了。 在您的 Thread 类中添加一个 this:

    private boolean pause = false;
    
    private synchronized void check(){
    while(pause){
    wait();
    }
    }
    
    public void pauseThread(){
    pause = true;
    }
    
    public void resumeThread(){
    pause = false;
    notify();
    }
    

    当 onSurfaceDestroyed 被调用时,你需要使用你创建的方法暂停线程:pauseThread();

    同时调用方法 check();在while循环中,所以:

    while(true){
     check();
    ... other code ...
    }
    

    并在activity类中创建一个onResume()方法,这样每当用户返回应用程序时,它就会自动调用该方法,并将这段代码放入该方法中:

    resumeThread();
    

    我希望这会对你有所帮助,我不确定这是否是你需要的所有代码,因为我现在不在家,如果它不起作用,我在家时看看和编辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      • 2015-09-30
      • 2011-12-02
      • 1970-01-01
      相关资源
      最近更新 更多