2012-09-17 4 views
0

첫 안드로이드 게임을 만들고 있는데 내 게임 스레드에 문제가 있습니다. 문제는 내가 멈추고 뒤로 또는 홈 버튼을 누르면 오류가 발생한다는 것입니다. "(내 애플 리케이션 게임에서) 활동이 응답하지 않는 내 코드 :.?.홈 버튼을 눌렀을 때 안드로이드 스레드가 일시 중지/다시 응답하지 않음

public class GameLoopThread extends Thread { 
static final long FPS = 10; 
private GameView view; 
private boolean running = false; 

private Object mPauseLock; 
private boolean mPaused; 

public GameLoopThread(GameView view) { 
    this.view = view; 
} 

public void setRunning(boolean run) { 
    running = run; 
    mPauseLock = new Object(); 
    mPaused = false; 

} 

@Override 
public void run() { 
    long ticksPS = 1000/FPS; 
    long startTime; 
    long sleepTime; 
    while (running) { 
     Canvas c = null; 
     startTime = System.currentTimeMillis(); 
     try { 
      c = view.getHolder().lockCanvas(); 
      synchronized (view.getHolder()) { 
       view.onDraw(c); 
      } 
     } finally { 
      if (c != null) { 
       view.getHolder().unlockCanvasAndPost(c); 
      } 
     } 
     sleepTime = ticksPS - (System.currentTimeMillis() - startTime); 
     try { 
      if (sleepTime > 0) 
       sleep(sleepTime); 
      else 
       sleep(10); 
     } catch (Exception e) { 
     } 

     synchronized (mPauseLock) { 
      while (mPaused) { 
       try { 
        mPauseLock.wait(); 
       } catch (InterruptedException e) { 
       } 
      } 
     } 

    } 

} 

/** 
* Call this on pause. 
*/ 
public void onPause() { 
    synchronized (mPauseLock) { 
     mPaused = true; 
    } 
} 

/** 
* Call this on resume. 
*/ 
public void onResume() { 
    synchronized (mPauseLock) { 
     mPaused = false; 
     mPauseLock.notifyAll(); 
    } 
    } 
    } 

내가 잘못을하고있는 중이 야 무엇을

+0

LogCat 출력을 제공 할 수 있습니까? –

+0

while 루프가 있습니다 : while (mPaused) {... 한 번만 기다려주세요. – fonZ

+0

그리고 여러 스레드에 의해 수정 될 수있는 객체에만 해당하므로 많은 동기화가 필요하다고 생각하지 않습니다. – fonZ

답변

0

대부분의 경우 응용 프로그램이 다시 시작하면 중지 된 스레드를 시작하려고이 오류의 원인과 충돌하는 응용 프로그램을 일으키는 것입니다.

것은 확인하여 로그 캣 로그를 살펴 보자.

+0

뭔가 keyDispatchingTimedOut에 대해 뭔가가 09-17 21 : 50 : 30.716 : – Korangar

+0

그것은 일시 중지하고 잘 다시 시작하지만, 일시 중지하고 내가 다시 또는 집 버튼을 누르면 오류가 나타날 때. – Korangar

+0

전에 비슷한 문제가 있었는데, 스레드를 초기화하는보기와 관련이있었습니다. 그러면 집에 갔을 때 파괴되었지만보기가 계속 시작하려고했습니다. 그것은 당신이 가진 문제가 아닐 수도 있습니다. 지금 당장 추측하고 있습니다 :/(나는 아직 50 명의 담당자가 아니지만 주석으로 게시했을 것입니다.) – Clark

1

먼저 응용 프로그램이 계속 될 때 실행하면 응용 프로그램이? 실행되는 동안 전원 버튼을 누르려고했다 당신이 그것을 시도한 후에 당신은 앱을 다시 연다. 스레드 코드와 표면 클래스는 문제가 없습니다. 문제 (홈 버튼 부분)를 해결하려면이 방법을 귀하의 appcompatactivity에 추가하십시오.

public class Game extends AppCompatActivity { 
public int i = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    setContentView(new YourSurfaceGame(this,"player1")); 
} 
//Add this override method to your appcompatactivity 
@Override 
protected void onStart() { 
    super.onStart(); 
    //Re-declare your surface game class is the main solution here 
    setContentView(new YourSurfaceGame(this,"player1")); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
} 
} 

가정과 전원 버튼을 누르는 것 사이를 비교할 때 이상한 점을 알았지 만 버튼 홈 문제를 해결하는 데 몇 시간이 걸렸습니다. 이 코드를 시도하고 게임 진행 상황이 모두 사라진 것을 알면 https://www.tutorialspoint.com/android/android_shared_preferences.htm이 답입니다.

다른 게임 응용 프로그램에서도 같은 결과를 보았습니다. 결론은 옳았습니다. 집이나 전원 버튼을 누르면 게임이 일시 중지됩니다. 사실, 스레드를 확장으로 사용하고 mainthread 클래스 내에서 extended로 timertask를 사용할 때와 다른 경우이 문제를 발견하게됩니다. , 나는 결코 전에 그것을 시도하지 않는다.

관련 문제