Android 当从视图调用新意图时会发生什么?
我正在尝试使用以下方法从我的gameView启动一个新的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
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);
}
}
}
}