简体   繁体   中英

android canvas when on turn my phone it crash

I'm just playing with the canvas and surfaceview to get a better understand however when I turn the phone crash and the view pretty much the same I though that what surface was support take care of here my code can some tell me what going on and how to fix it.

public class test extends Activity { 
private int Playery =0;
private int Playerx =0;
private float RectStartx =0;
private float RectStarty= 120;
private float RectEndx =240;
private float RectEndy =240;
private int ImageBottom; 

private boolean trueOrFalse = true;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new Frame(this));
    }

    class Frame extends SurfaceView implements SurfaceHolder.Callback{
        private frameThread thread;

        public Frame(Context context) {
            super(context);
            getHolder().addCallback(this);
            thread = new frameThread(getHolder(),this); 
        }

        @Override
        public void onDraw(Canvas canvas){
            canvas.drawColor(Color.RED);
            canvas.drawRect(RectStartx, RectStarty, RectEndx, RectEndy, new Paint(Color.RED));

            if(trueOrFalse == true){
                Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
                canvas.drawBitmap(bitmap, Playerx, Playery, null);

                ImageBottom = Playery + bitmap.getHeight(); 

                if(ImageBottom != RectStarty || Playerx > RectEndx || Playerx < RectStartx ){
                    Playery = Playery+2; 
                }

                if(Playery > RectEndx){
                    trueOrFalse = false;
                }
            }
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if(ImageBottom == RectStarty){
                Playerx = Playerx+10;
            }

            return super.onTouchEvent(event);
        }

        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

        }
        public void surfaceCreated(SurfaceHolder holder) {
            thread.setRunning(true);
            thread.start();
        }
        public void surfaceDestroyed(SurfaceHolder holder) {
            boolean retry = true;
            while (retry){
                try{
                    thread.join();
                    retry = false;
                }catch(InterruptedException e ){

                }
            }
        }
    }  

    class frameThread extends Thread{
        private SurfaceHolder _surfaceHolder;
        private Frame _frame;
        private boolean _run = false;

        public frameThread(SurfaceHolder surfaceHolder, Frame frame){
            _surfaceHolder = surfaceHolder;
            _frame = frame;
        }

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

        @Override
        public void run(){
            Canvas c;
            while(_run){
                c = null;
                try{
                    c = _surfaceHolder.lockCanvas(null);
                synchronized (_surfaceHolder){
                    _frame.onDraw(c);
                }
                }finally{
                    if(c != null){
                        _surfaceHolder.unlockCanvasAndPost(c);
                    }
                }
            }
        }
    }
}

When you turn the phone your view is going to get destroyed and recreated.

In your surfaceDestroyed(SurfaceHolder) method you join() on your frame thread, and I'm guessing that this join never succeeds and causes your app to force quit.

It looks like you need to setRunning(false) on your thread before you join as this is the only way your thread will leave its while loop.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM