public void run() {
    while (mIsRunning) {
if((System.currentTimeMillis()-starttime)<=10000){
    /**拿到当前画布 然后锁定**/
    mCanvas =mSurfaceHolder.lockCanvas();
    if(mCanvas!=null){
        mPaint.setXfermode(new PorterDuffXfermode(Mode.SRC_OVER));  
        mCanvas.drawPaint(mPaint);  
Draw();
    /**绘制结束后解锁显示在屏幕上**/
    mSurfaceHolder.unlockCanvasAndPost(mCanvas);
    }
}
else{
Intent scoreintent = new Intent(getApplicationContext(),myscore.class);
SurfaceViewAcitvity.this.startActivity(scoreintent);
} try {
    Thread.sleep(100);
} catch (InterruptedException e) {
    e.printStackTrace();
}
    }
}我每次进入游戏十秒之后就会卡在这个surfaceview里面,问题出在哪?

解决方案 »

  1.   

    有什么问题吗?你启动activity后需要把mIsRunning置为false吗
      

  2.   

    mIsRunning设置为false也还是报错,确实游戏进行了10秒,但是10秒之后就卡掉了
      

  3.   

    怀疑是线程的问题,这是我去掉了无关的代码,能看出问题出在哪吗public class SurfaceViewAcitvity extends Activity{
        AnimView mAnimView = null;
        @Override
        public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 显示自定义的游戏View
    mAnimView = new AnimView(this,display.getWidth(), display.getHeight());
    setContentView(mAnimView);
        }
        public class AnimView extends SurfaceView implements Callback,Runnable{
            /**游戏开始时间**/
         long starttime = 0;
    /**游戏状态**/
    private int mState = STATE_GAME; 
    Paint mPaint = null;
    /**游戏主线程**/
    private Thread mThread = null;
    /**线程循环标志**/
    private boolean mIsRunning = false;
    private SurfaceHolder mSurfaceHolder = null;
    private Canvas mCanvas = null;
    private Context mContext = null;
    /**
     * 构造方法
     */
    public AnimView(Context context,int screenWidth, int screenHeight) {
        super(context);
        mContext = context;
        mThread = new Thread(this);
        mPaint = new Paint();
        /**获取mSurfaceHolder**/
        mSurfaceHolder = getHolder();
        mSurfaceHolder.addCallback(this);
        setFocusable(true);
        setGameState(STATE_GAME);
    }
            public void draw(){
                         //略,画动画
            }
    public void run() {
        while (mIsRunning) {
    if((System.currentTimeMillis()-starttime)<=10000){
        /**拿到当前画布 然后锁定**/
        mCanvas =mSurfaceHolder.lockCanvas();
        if(mCanvas!=null){
            mPaint.setXfermode(new PorterDuffXfermode(Mode.SRC_OVER));
            mCanvas.drawPaint(mPaint);  
            Draw();
        }
    }
    else{
    mIsRunning = false;
    Intent scoreintent = new Intent(getApplicationContext(),myscore.class);
    SurfaceViewAcitvity.this.startActivity(scoreintent);
    } }
    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }finally{
        /**绘制结束后解锁显示在屏幕上**/
        mSurfaceHolder.unlockCanvasAndPost(mCanvas);
    }
        }
    }
    public void surfaceCreated(SurfaceHolder arg0) {
        /**启动游戏主线程**/
        mIsRunning = true;
        starttime = System.currentTimeMillis();
        mThread.start();
    }

    public void surfaceDestroyed(SurfaceHolder arg0) {
        // surfaceView销毁的时候
        mIsRunning = false;
    }
        }
        
    }
      

  4.   

    我是新手,不知道什么是ANR错误,我这个是一看是运行都好好的,可以进游戏的,玩了10秒(我是设置游戏10秒之后跳到另一个activity的)就eclipse就弹出那个对话框
    DalvikVM[localhost:8621]
    Thread [<1> main] (Suspended (exception IllegalArgumentException))
    <VM does not provide monitor information>
    ActivityThread.performLaunchActivity(ActivityThread$ActivityClientRecord, Intent) line: 2004
    ActivityThread.handleLaunchActivity(ActivityThread$ActivityClientRecord, Intent) line: 2105
    ActivityThread.access$600(ActivityThread, ActivityThread$ActivityClientRecord, Intent) line: 136
    ActivityThread$H.handleMessage(Message) line: 1201
    ActivityThread$H(Handler).dispatchMessage(Message) line: 99
    Looper.loop() line: 137
    ActivityThread.main(String[]) line: 4875
    Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
    Method.invoke(Object, Object...) line: 511
    ZygoteInit$MethodAndArgsCaller.run() line: 804
    ZygoteInit.main(String[]) line: 571
    NativeStart.main(String[]) line: not available [native method]
    Thread [<10> Binder_2] (Running)
    Thread [<9> Binder_1] (Running)
    Thread [<11> Binder_3] (Running)
    Thread [<12> Thread-2056] (Suspended (exception IllegalArgumentException))
    <VM does not provide monitor information>
    SurfaceView$4.unlockCanvasAndPost(Canvas) line: 785
    SurfaceViewAcitvity$AnimView.run() line: 360
    Thread.run() line: 856
      

  5.   

    logcat里说什么
    06-30 19:30:38.364: E/SurfaceTextureClient(8479): Surface::unlockAndPost failed, no locked buffer
    似乎是没有将画布解锁,但是怎么改呢
      

  6.   

    估计这个出了错
    mSurfaceHolder.unlockCanvasAndPost(mCanvas);因为10秒后你的mCanvas没做什么,但你调用了mSurfaceHolder.unlockCanvasAndPost(mCanvas);试着在调用前判断下mIsRunning
      

  7.   

    我这样写了,还是10秒就卡掉了
    finally{
    if(mIsRunning){
       mSurfaceHolder.unlockCanvasAndPost(mCanvas);
    }
      

  8.   

    难道是thred.sleep的原因??
    我也稿不清了
      

  9.   

    把Intent scoreintent = new Intent(getApplicationContext(),myscore.class);
    SurfaceViewAcitvity.this.startActivity(scoreintent);移下来也不行,如果把这两句注释掉,动画10秒后会暂停,但是不报错,加上这两句就10秒后就直接黑屏了
    public void run() {
        while (mIsRunning) {
    if((System.currentTimeMillis()-starttime)<=10000){
        /**拿到当前画布 然后锁定**/
        mCanvas =mSurfaceHolder.lockCanvas();
        if(mCanvas!=null){
            mPaint.setXfermode(new PorterDuffXfermode(Mode.SRC_OVER));
            mCanvas.drawPaint(mPaint);  
            Draw();
        }
    }
    else{
    mIsRunning = false;
    }
    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }finally{
        /**绘制结束后解锁显示在屏幕上**/
    if(mIsRunning){
    mSurfaceHolder.unlockCanvasAndPost(mCanvas);
    }else{
    Intent scoreintent = new Intent(getApplicationContext(),myscore.class);
    SurfaceViewAcitvity.this.startActivity(scoreintent);
    }
    }
        }
    }

    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,int arg3) {
        // surfaceView的大小发生改变的时候
    }
      

  10.   

    public void run() {
                while (mIsRunning) {
                        if((System.currentTimeMillis()-starttime)<=10000){
                            /**拿到当前画布 然后锁定**/
                            mCanvas =mSurfaceHolder.lockCanvas();
                            if(mCanvas!=null){
                                mPaint.setXfermode(new PorterDuffXfermode(Mode.SRC_OVER));
                                mCanvas.drawPaint(mPaint);  
                                Draw();
                            }
                        }
                        else{
                            mIsRunning = false;
                            break;
                        }
     
                    }
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }finally{
                        /**绘制结束后解锁显示在屏幕上**/
                        mSurfaceHolder.unlockCanvasAndPost(mCanvas);
                    }
                }
            }
            Intent scoreintent = new Intent(getApplicationContext(),myscore.class);
                            SurfaceViewAcitvity.this.startActivity(scoreintent);
      

  11.   

    谁能告诉我如何在线程里启动别的activity
      

  12.   

    建议:
    1.mIsRunning = false;后就不需要再sleep了。
    2.可以试试用handler在主线程中启动新acitivity。