如何在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吗 --------------------编程问答-------------------- mIsRunning设置为false也还是报错,确实游戏进行了10秒,但是10秒之后就卡掉了 --------------------编程问答-------------------- 报什么错?A --------------------编程问答-------------------- 怀疑是线程的问题,这是我去掉了无关的代码,能看出问题出在哪吗
public class SurfaceViewAcitvity extends Activity{--------------------编程问答-------------------- 报ANR错吗???? --------------------编程问答-------------------- 我是新手,不知道什么是ANR错误,我这个是一看是运行都好好的,可以进游戏的,玩了10秒(我是设置游戏10秒之后跳到另一个activity的)就eclipse就弹出那个对话框
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;
}
}
}
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
--------------------编程问答-------------------- 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秒就卡掉了
finally{
if(mIsRunning){
mSurfaceHolder.unlockCanvasAndPost(mCanvas);
} --------------------编程问答--------------------
难道是thred.sleep的原因??
我也稿不清了 --------------------编程问答--------------------
估计这个出了错
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