java - 使用 thread.join 从 SurfaceView 结束 Android Activity

标签 java android multithreading android-activity surfaceview

我正在开发我的第一个 Android 应用程序——snake。现在我正在尝试为该应用程序实现“游戏结束”。所以基本上当蛇撞到墙上时,应用程序应该询问你的名字并将你的分数放在 HiScore 上。好吧,我对撞墙 fragment 感到很困惑。我正在尝试线程,到目前为止我还没有找到在不出错的情况下停止它的方法。

我用谷歌搜索了很多,每个人都说 thread.join();正在等待线程结束,那么结束每半秒绘制一次简单正方形的线程需要多长时间?当我在玩游戏时按下手机上的后退按钮时,暂停();功能完美运行。 LogCat 上出现日志“游戏已结束”。

所以问题是,当蛇撞到墙上时,我无法停止此 Activity ,日志“游戏已结束”永远不会发生。这是为什么?

我的代码:

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();
        }
    }

和 Activity 类别:

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();

来自:

How can I end an activity from inside a SurfaceView class or nested thread

虽然它不能让我满意……现在已经足够了

关于java - 使用 thread.join 从 SurfaceView 结束 Android Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18424158/

相关文章:

java - JSP中如何将值从外部页面传递到父页面

android - 如何覆盖具有自己 Activity 的库的样式

java - Android onsaveinstancestate()

c++ - 如何在双向套接字连接上序列化类似 telnet 的通信?

java - GWT 数据网格列

java - 当给予大量资源来执行简单计算时,Spark 工作线程 'KILLED exitStatus 143'

JAVA APACHE-POI 表

java - setImageBitmap() 比 image.setImageDrawable()、image.setImageResource() 慢

mysql - 刷新线程中的查询

c - 线程启动时的 Winapi 错误 87