2011-08-15 16 views
7

私はオブジェクトを表示するためにSurfaceView実装を使用しているゲームを持っています。 SurfaceViewを時々画面に描画するスレッドがあります。 ゲームは完全に実行されています。残念ながら、ゲームが中断されるたびに一時停止機能が必要でした。 まあ、私はonResumeとを操作する必要があることを知っています。onResume/onPauseでのスレッドの再起動/一時停止

しかし、私はそれを正しくすることはできません。エラーは私がsurfaceCreatedに戻り、スレッドが既に開始していることを知らせるスレッドを開始します。 onResumeとにそれぞれresumesuspendを使用してみましたが、何も変更されませんでした。

どうすればこの問題を解決できますか? File-I/O処理を使用して、オブジェクトの場所をどのように保存するのかはすでに済んでいます。

ありがとうございます。

+0

[Androidのスレッドを一時停止/再開する方法は?](http://stackoverflow.com/questions/6776327/how-to-pause-resume-thread-in-android) – Wroclai

+0

悲しいことに、それはうまくいかなかった。 –

答えて

1

コードの内容を知らなくても

は、あなたがそうのような機能を実装することができますスレッドを「一時停止」にするには:

while(! this.isInterrupted()) 
    if(!paused) 
    { 
     ... Do something ... 
    } else { try { Thread.sleep(100) } catch (InteruptedException ie) {} } 

Do somethingあなたの表面のビューを無効またはお使いのアプリで進行を制御している場合、これは依存しています。 pausedのアクセサーは、アーキテクチャの他のビットに巻き込まれることなく、スレッドを一時停止して再開できるようにする必要があります。

2

実際にスレッドを自分で停止することはお勧めしません。stop()メソッドは推奨されていません。最も簡単な解決策は、スレッドのrun()メソッド内のループwhileのフラグを使用することです。スレッドを "停止"する必要があるときは、フラグをfalseに落とすだけで、スレッドは実行され続けるにもかかわらず、何も処理しません。 Androidはスレッドが必要なときに停止します。お役に立てれば。

+0

これで 'onPause'から実行中のフラグをfalseに設定したときにスレッドを再起動する方法は? –

+0

@Cyril Horad、あなたのアプリケーションはちょうど同じタスクを持つ別のスレッドを開始します – Egor

+0

別のスレッドを開始しますか?しかし、最初からタスクを開始する予定はありませんか? –

3

これは私がやったことです:のCreateThreadで

@Override 
    public void surfaceCreated(SurfaceHolder arg0) { 
      if (thread.getState() == Thread.State.TERMINATED){ 
       CreateThread(getHolder(),getContext()); 
      } 
      thread.setRunning(true); 
      thread.start(); 
    } 
  • あなたがスレッド=新しいMyThread(...)を持っている必要があります。
  • setRunning(boolean mRun)は、実行関数を開始/停止するためにブール値を使用します(私はLunarLanderに触発されたと思います)。

onPause/onResumeを正しく使用するには、スレッドで使用する変数をスレッド内に入れないでください(LunarLanderのように)。

// Variables declarations 

public MyGameThread CreateThread(...){ 
thread = new MyGameThread(holder, context, new Handler() { 
// and so on.... 
}); 
} 

あなたはonPause/onResumeを通過するときに、あなたのスレッドは破壊され、reneweledいますが、それ以外の場所の変数を置けば、あなたは後にそれらを使用し続けることができます:私はあなたがそのように行うことをお勧めします。

あなたが維持するために重要な何かを持っている場合は、このオプションのいずれかを使用します。

  • SharedPreferences:XMLを作成しても、アプリの終了後も持続変数を使用して、ローカルに保存されます。
  • 5~10個を超える変数を管理する場合は、SQLデータベースを使用します。この場合、前のオプションを使用するのは難しいためです。あなたはこの質問に一つまたは二つのスレッドを持っている場合、私はわからないんだ
+0

これをさらに展開できますか?私はそれを介して入ることはできません。返事が遅くなってごめん。 –

+0

さて、このブログの勉強を始めてください:http://wonton-games.blogspot.com/2010/06/lunar-lander-resume-game-workaround.html私はそこに "lunarlander problem"についてたくさんあります。その後、詳細な質問に戻ってください;) – Zappescu

1

、私は2を仮定しているあなたはonPause呼び出すときに3つのことを行う必要がありますスレッドの

1 - Save the state of the application (all game variables, states, etc) 
2 - Kill the surfaceView by calling suspend. 
3 - Kill the other thread (we'll call it Thread B). 

キリングBはあなたの問題だと思います。スレッドを中断して終了するようにしたい場合や、onPauseを呼び出すときにスレッドが引き続きその処理を行うようにしたい場合。その後、ゲームに戻ったときに、スレッドが再び作成されて問題を引き起こします。あなたのスレッドのwhile()ループでは

  • while(run)がコードを実行しますブール「実行」を持って、2:適切にスレッドを殺すために方法があります。 runをfalseに変更すると、スレッドは終了します。
  • スレッドがスリープ状態になっている場合(私はそれがゲームの後に実行され、w.r.t時間実行されていると仮定します)、InterruptedExceptionをキャッチしてそこで終了します。スレッドを強制終了する場合は、そのスレッドに例外をスローします。

最初のものははるかに簡単です。