Android画布什么时候转动我的手机崩溃

时间:2011-03-06 07:03:17

标签: android

我只是在玩画布和surfaceview以获得更好的理解然而当我转动手机崩溃和视图几乎相同我虽然表面支持在哪里照顾我的代码可以告诉我一些什么继续以及如何解决它。

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);
                    }
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

当您转动手机时,您的视图将被破坏并重新创建。

在您的surfaceDestroyed(SurfaceHolder)方法中,您join()在您的框架线程上,我猜这个连接永远不会成功并导致您的应用强制退出。

在你加入之前,你的线程看起来需要setRunning(false),因为这是你的线程离开while循环的唯一方法。