Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
Android 当从视图调用新意图时会发生什么?_Android_Loops_Android Activity_Surfaceview_Lag - Fatal编程技术网

Android 当从视图调用新意图时会发生什么?

Android 当从视图调用新意图时会发生什么?,android,loops,android-activity,surfaceview,lag,Android,Loops,Android Activity,Surfaceview,Lag,我正在尝试使用以下方法从我的gameView启动一个新的intent: if(happy.getHP() <= 0){ //if my main-character dies thread.setRunning(false); Context context = getContext(); Intent intent = new Intent("nielsen.happy.activities.ENDSCREE

我正在尝试使用以下方法从我的gameView启动一个新的
intent

    if(happy.getHP() <= 0){ //if my main-character dies
            thread.setRunning(false);
            Context context = getContext();
            Intent intent = new Intent("nielsen.happy.activities.ENDSCREEN");
            context.startActivity(intent);
在下面添加整个方法:

    private void checkCollision(Canvas canvas) {
    Rect h1 = happy.getBounds();
    for (int i = 0; i < enemies.size(); i++) {
        Rect e1 = enemies.get(i).getBounds();
        if (h1.intersect(e1)){
            if(enemies.get(i).getX() < controls.pointerPosition.x){
                enemies.get(i).setX(-20);
            }else if (enemies.get(i).getX() > controls.pointerPosition.x){
                enemies.get(i).setX(20);
            }else if(enemies.get(i).getY() < controls.pointerPosition.y){
                enemies.get(i).setY(-20);
            }else if(enemies.get(i).getY() > controls.pointerPosition.y){
                enemies.get(i).setY(20);
            }
            if(enemies.get(i).getCooldown() <= 0){
            happy.damageHP(10);
            score.incScore(-10);
            enemies.get(i).setCooldown();
            }
        }
        if(happy.getHP() <= 0){

            thread.setRunning(false);
            try {
                thread.join();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Context context = getContext();
            Intent intent = new Intent("nielsen.happy.activities.ENDSCREEN");
            context.startActivity(intent);
            //end-screen                           !!!!!!!
        }
        if(enemies.get(i).getHP() <= 0){
            enemies.get(i).death(canvas, enemies);
            score.incScore(5);
            break;
        }   
        for (int j = 0; j < bullets.size(); j++) {
            Rect b1 = bullets.get(j).getBounds();
            if (b1.intersect(e1)) {
                enemies.get(i).damageHP(5);
                bullets.remove(j);
            }
        }
    }
}
private void checkCollision(画布){
Rect h1=happy.getBounds();
for(int i=0;icontrols.pointerPosition.x){
敌人.get(i).setX(20);
}else if(敌人.get(i).getY()controls.pointerPosition.y){
敌人。get(i)。setY(20);
}

如果(friends.get(i).getCooldown()我必须查看您的线程正在做什么才能确定,但我非常确定类似的事情正在发生:

  • 调用setRunning(false),它在thread类中设置了一些标志

  • 您启动了新的意图,但线程尚未停止,因为它尚未到达检查运行标志的部分

  • 线程(尚未暂停)开始对gui进行更改,这使android UI感到困惑,认为视图应该是非活动的

  • 线程到达了等待setRunning(true)的位置,一切又恢复了


如果这是真的,您可以通过等待线程在setRunning上被阻塞(true)来修复,然后创建新的意图。

我必须查看您的线程正在做什么才能确定,但我非常确定类似的情况正在发生:

  • 调用setRunning(false),它在thread类中设置了一些标志

  • 您启动了新的意图,但线程尚未停止,因为它尚未到达检查运行标志的部分

  • 线程(尚未暂停)开始对gui进行更改,这使android UI感到困惑,认为视图应该是非活动的

  • 线程到达了等待setRunning(true)的位置,一切又恢复了


如果这是真的,您可以通过等待线程在setRunning上被阻塞(true)来修复,然后创建新的意图。

好的,现在我看到了您的线程,我有一个更好的答案:在thread.setRunning(false)之后,添加“thread.join()”。这将一直阻止,直到线程完成。我也尝试过这一点,这只是将游戏冻结在应该显示结束屏幕的点上。=/您可以发布调用setRunning的整个方法吗(false)?您可能已同步(SurfaceHold)因此,线程正在等待您释放已同步线程,而您正在等待线程完成,这将导致死锁。确实如此,它现在正在尝试不同步。将添加方法来询问它是否工作:)叹气,still dosnt work=/就像我删除同步之前一样冻结。将整个方法添加到问题中好的,现在我看到了你的线程,我有了更好的答案:在thread.setRunning(false)之后,添加“thread.join()”。这将一直阻止,直到线程完成。我也尝试过这一点,这只是将游戏冻结在应该显示结束屏幕的点上。=/您可以发布调用setRunning的整个方法吗(false)?您可能已同步(SurfaceHold)因此,线程正在等待您释放已同步线程,而您正在等待线程完成,这会导致死锁。确实如此,现在尝试不同步。将添加方法来质疑它是否工作:)叹气,仍然工作=/就像我删除已同步线程之前一样冻结。添加了整个方法质疑
    private void checkCollision(Canvas canvas) {
    Rect h1 = happy.getBounds();
    for (int i = 0; i < enemies.size(); i++) {
        Rect e1 = enemies.get(i).getBounds();
        if (h1.intersect(e1)){
            if(enemies.get(i).getX() < controls.pointerPosition.x){
                enemies.get(i).setX(-20);
            }else if (enemies.get(i).getX() > controls.pointerPosition.x){
                enemies.get(i).setX(20);
            }else if(enemies.get(i).getY() < controls.pointerPosition.y){
                enemies.get(i).setY(-20);
            }else if(enemies.get(i).getY() > controls.pointerPosition.y){
                enemies.get(i).setY(20);
            }
            if(enemies.get(i).getCooldown() <= 0){
            happy.damageHP(10);
            score.incScore(-10);
            enemies.get(i).setCooldown();
            }
        }
        if(happy.getHP() <= 0){

            thread.setRunning(false);
            try {
                thread.join();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Context context = getContext();
            Intent intent = new Intent("nielsen.happy.activities.ENDSCREEN");
            context.startActivity(intent);
            //end-screen                           !!!!!!!
        }
        if(enemies.get(i).getHP() <= 0){
            enemies.get(i).death(canvas, enemies);
            score.incScore(5);
            break;
        }   
        for (int j = 0; j < bullets.size(); j++) {
            Rect b1 = bullets.get(j).getBounds();
            if (b1.intersect(e1)) {
                enemies.get(i).damageHP(5);
                bullets.remove(j);
            }
        }
    }
}