当前位置:编程学习 > wap >>

如何在surfaceView的run方法中实现十秒之后跳转到另一个activity

		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里面,问题出在哪? --------------------编程问答-------------------- --------------------编程问答-------------------- 有没有人呀 --------------------编程问答-------------------- 有什么问题吗?你启动activity后需要把mIsRunning置为false吗 --------------------编程问答--------------------
引用 3 楼 guoyoulei520 的回复:
有什么问题吗?你启动activity后需要把mIsRunning置为false吗
mIsRunning设置为false也还是报错,确实游戏进行了10秒,但是10秒之后就卡掉了 --------------------编程问答-------------------- 报什么错?A --------------------编程问答--------------------
引用 3 楼 guoyoulei520 的回复:
有什么问题吗?你启动activity后需要把mIsRunning置为false吗
怀疑是线程的问题,这是我去掉了无关的代码,能看出问题出在哪吗
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;
}
    }
    
}
--------------------编程问答-------------------- 报ANR错吗???? --------------------编程问答--------------------
引用 7 楼 guoyoulei520 的回复:
报ANR错吗????
我是新手,不知道什么是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
--------------------编程问答--------------------
引用 7 楼 guoyoulei520 的回复:
报ANR错吗????
logcat里说什么
06-30 19:30:38.364: E/SurfaceTextureClient(8479): Surface::unlockAndPost failed, no locked buffer
似乎是没有将画布解锁,但是怎么改呢
--------------------编程问答-------------------- 估计这个出了错
mSurfaceHolder.unlockCanvasAndPost(mCanvas);

因为10秒后你的mCanvas没做什么,但你调用了mSurfaceHolder.unlockCanvasAndPost(mCanvas);

试着在调用前判断下mIsRunning --------------------编程问答--------------------
引用 10 楼 guoyoulei520 的回复:
估计这个出了错
mSurfaceHolder.unlockCanvasAndPost(mCanvas);

因为10秒后你的mCanvas没做什么,但你调用了mSurfaceHolder.unlockCanvasAndPost(mCanvas);

试着在调用前判断下mIsRunning
我这样写了,还是10秒就卡掉了
finally{
if(mIsRunning){
   mSurfaceHolder.unlockCanvasAndPost(mCanvas);
} --------------------编程问答--------------------
引用 11 楼 henha2jiang 的回复:
Quote: 引用 10 楼 guoyoulei520 的回复:

估计这个出了错
mSurfaceHolder.unlockCanvasAndPost(mCanvas);

因为10秒后你的mCanvas没做什么,但你调用了mSurfaceHolder.unlockCanvasAndPost(mCanvas);

试着在调用前判断下mIsRunning
我这样写了,还是10秒就卡掉了
finally{
if(mIsRunning){
   mSurfaceHolder.unlockCanvasAndPost(mCanvas);
}

难道是thred.sleep的原因??
我也稿不清了 --------------------编程问答--------------------
引用 10 楼 guoyoulei520 的回复:
估计这个出了错
mSurfaceHolder.unlockCanvasAndPost(mCanvas);

因为10秒后你的mCanvas没做什么,但你调用了mSurfaceHolder.unlockCanvasAndPost(mCanvas);

试着在调用前判断下mIsRunning

把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的大小发生改变的时候
}
--------------------编程问答--------------------
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);

--------------------编程问答-------------------- 谁能告诉我如何在线程里启动别的activity --------------------编程问答-------------------- 建议:
1.mIsRunning = false;后就不需要再sleep了。
2.可以试试用handler在主线程中启动新acitivity。
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,