Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用thread.join从surfaceview结束android活动_Java_Android_Multithreading_Android Activity_Surfaceview - Fatal编程技术网

Java 使用thread.join从surfaceview结束android活动

Java 使用thread.join从surfaceview结束android活动,java,android,multithreading,android-activity,surfaceview,Java,Android,Multithreading,Android Activity,Surfaceview,我正在为android开发我的第一个应用程序——snake。现在我正在尝试为那个应用程序实现“游戏结束”。所以基本上当蛇撞到墙上时,应用程序应该询问你的名字,并把你的分数写在它的核心上。好吧,我正在研究撞墙碎片。我正在尝试线程,到目前为止,我还没有找到不出错就停止它的方法 我在谷歌上搜索了很多,每个人都在说这个帖子;正在等待线程结束,那么每半秒结束一次绘制简单正方形的线程需要多长时间?当我在玩时按下手机上的后退按钮时,暂停();这个函数工作得很好。日志“游戏已结束”出现在LogCat上 所以问题

我正在为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退出线程,最后找到了它!!!