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里面,问题出在哪?
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里面,问题出在哪?
解决方案 »
- listview的优化
- 变态需求,求高人指点!
- popupwindow改变背景颜色已经透明度的问题
- 带输入框AlertDialog 第二次点击出现错误
- Content provider 何时被创建 何时被销毁?
- 如何对一个view进行布局?
- 为什么在使用Android native Thread时报错Fatal signal 11 (SIGSEGV)?
- 请问android能对手机内存进行读写吗?
- android 登录twiiter之后的问题
- adb logcat命令行如何查看某个进程的log信息? (已知进程的ID 和 有APK应用的源码)
- 自己写的程序通过NFC两个设备间传图片能实现么
- android应用程序开发疑惑
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
06-30 19:30:38.364: E/SurfaceTextureClient(8479): Surface::unlockAndPost failed, no locked buffer
似乎是没有将画布解锁,但是怎么改呢
mSurfaceHolder.unlockCanvasAndPost(mCanvas);因为10秒后你的mCanvas没做什么,但你调用了mSurfaceHolder.unlockCanvasAndPost(mCanvas);试着在调用前判断下mIsRunning
finally{
if(mIsRunning){
mSurfaceHolder.unlockCanvasAndPost(mCanvas);
}
我也稿不清了
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的大小发生改变的时候
}
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);
1.mIsRunning = false;后就不需要再sleep了。
2.可以试试用handler在主线程中启动新acitivity。