[英]ending android activity from surfaceview using thread.join
我正在为Android开发第一个应用程序-snake。 现在,我正在尝试为该应用实施“游戏结束”。 因此,基本上,当蛇撞到墙上时,应用程序应该询问您的名字,并将其分数记录在HiScore上。 好吧,我在砸墙碎片。 我正在尝试线程,到目前为止,我还没有找到停止错误的方法。
我在Google上搜索了很多,每个人都在说thread.join();。 正在等待线程结束,那么结束每半秒绘制一次简单正方形的线程需要多长时间? 当我在播放时按下手机上的后退按钮时,pause(); 功能完美运行。 日志“游戏已结束”出现在LogCat上。
因此,问题在于当蛇撞到墙上时,我无法停止此活动,永远不会发生“游戏已结束”日志。 这是为什么?
我的代码:
public class SnakeCage extends SurfaceView implements Runnable{
// blah blah .. functions that draw and stuff ..
public void pause() {
isRunning = false;
while(true){
try {
aThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
break;
}
aThread = null;
Log.d("pause()","game has ended"); // <<<<<<<<<THIS ONE>>>>>>>>>
}
public void resume() {
isRunning = true;
aThread = new Thread(this);
aThread.start();
}
public void init(){
// blah blah...
}
private void gameOver() {
int pHeadX = snakeHead.posX;
int pHeadY = snakeHead.posY;
Log.d("gameOver()", "checking");
if(pHeadY<0 || pHeadX<0 || pHeadX>23 || pHeadY>19){
Log.d("gameOver()", "game now will end");
gameOver = true;
}
}
public void run() {
while (isRunning){
if(!aHolder.getSurface().isValid())
continue;
canvas = aHolder.lockCanvas();
// drawing
gameOver();
if(gameOver) break;
// more drawing
aHolder.unlockCanvasAndPost(canvas);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if(gameOver){
pause();
}
}
和活动类:
public class PlayingActivity extends Activity implements OnClickListener{
SnakeCage v;
Button snakeGoUp;
Button snakeGoDown;
Button snakeGoLeft;
Button snakeGoRight;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.frame_layout);
v = (SnakeCage)findViewById(R.id.sView);
// listeners and stuff
}
@Override
protected void onPause() {
super.onPause();
v.pause();
}
@Override
protected void onResume() {
super.onResume();
v.resume();
}
@Override
public void onClick(View view) {
switch(view.getId()){
case R.id.snakeUp:
v.move(1);
break;
case R.id.snakeDown:
v.move(2);
break;
case R.id.snakeLeft:
v.move(3);
break;
case R.id.snakeRight:
v.move(4);
break;
}
}
}
我已经做了:
Context context = getContext();
((PlayingActivity)context).finish();
从:
虽然它不令我满意...就目前而言
我建议使用LocalBroadcastManager将消息发送到Activity
,以通知它杀死自己。 您可以在Activity
有一个内部类来接收广播,并在Activity
调用一个私有方法以结束广播。
public class MyActivity extends Activity {
public void onCreate(Bundle state) {
LocalBroadcastManager.getInstance(this).registerReceiver(new MessageHandler(),
new IntentFilter("kill"));
}
private void killActivity() {
finish();
}
public class MessageHandler extends BroadcastReceiver {
onReceive(Context context, Intent intent) {
killActivity();
}
}
然后,在SurfaceView
您所需要做的就是:
Intent intent = new Intent("kill");
LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent);
它的代码多一点,但恕我直言。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.