Java 使用thread.join从surfaceview结束android活动
我正在为android开发我的第一个应用程序——snake。现在我正在尝试为那个应用程序实现“游戏结束”。所以基本上当蛇撞到墙上时,应用程序应该询问你的名字,并把你的分数写在它的核心上。好吧,我正在研究撞墙碎片。我正在尝试线程,到目前为止,我还没有找到不出错就停止它的方法 我在谷歌上搜索了很多,每个人都在说这个帖子;正在等待线程结束,那么每半秒结束一次绘制简单正方形的线程需要多长时间?当我在玩时按下手机上的后退按钮时,暂停();这个函数工作得很好。日志“游戏已结束”出现在LogCat上 所以问题是,当蛇撞到墙上时,我无法停止这项活动,日志“游戏已经结束”从未出现过。为什么呢 我的代码:Java 使用thread.join从surfaceview结束android活动,java,android,multithreading,android-activity,surfaceview,Java,Android,Multithreading,Android Activity,Surfaceview,我正在为android开发我的第一个应用程序——snake。现在我正在尝试为那个应用程序实现“游戏结束”。所以基本上当蛇撞到墙上时,应用程序应该询问你的名字,并把你的分数写在它的核心上。好吧,我正在研究撞墙碎片。我正在尝试线程,到目前为止,我还没有找到不出错就停止它的方法 我在谷歌上搜索了很多,每个人都在说这个帖子;正在等待线程结束,那么每半秒结束一次绘制简单正方形的线程需要多长时间?当我在玩时按下手机上的后退按钮时,暂停();这个函数工作得很好。日志“游戏已结束”出现在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();
}
}
我只是:
Context context = getContext();
((PlayingActivity)context).finish();
发件人:
虽然我不满意。。。现在就足够了我刚刚做了:
Context context = getContext();
((PlayingActivity)context).finish();
发件人:
虽然我不满意。。。现在就足够了我建议使用LocalBroadcastManager向
活动
发送消息,通知它自杀。您可以在活动
中有一个内部类来接收广播,并在活动
中调用私有方法来结束广播
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);
它的代码多一点,但更干净。我建议使用LocalBroadcastManager向
活动发送消息,通知它自杀。您可以在活动
中有一个内部类来接收广播,并在活动
中调用私有方法来结束广播
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);
它的代码多一点,但它更干净了,IMHO。这对我很有用!我已经搜索了几个小时如何通过调用finish退出线程,最后找到了它!!!这对我有用!我已经搜索了几个小时如何通过调用finish退出线程,最后找到了它!!!