7

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

しかし、私はそれを正しく理解することはできません。surfaceCreatedエラーは、スレッドがすでに開始されていることを示すスレッドを開始した場所に戻ることを示しています。とをそれぞれresumesuspendで使ってみましたが、何も変わりませんでした。onResumeonPause

どうすればこれを達成できますか?File-I / O処理を使用して、オブジェクトの場所を保存する方法については、すでに説明しました。

前もって感謝します。

4

4 に答える 4

3

これは私がしたことです:

    @Override
    public void surfaceCreated(SurfaceHolder arg0) {
           if (thread.getState() == Thread.State.TERMINATED){
              CreateThread(getHolder(),getContext());
           }
           thread.setRunning(true);
           thread.start();
    }
  • CreateThreadでは、thread = new 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を通過すると、スレッドは破棄されて再ウェルされますが、変数をスレッドの外に置くと、その後も引き続き使用できます。

保存する重要なものがある場合は、次のいずれかのオプションを使用してください。

  • SharedPreferences:xmlが作成され、アプリの終了後も存続する変数とともにローカルに保存されます。
  • 5〜10を超える変数を管理する場合は、SQLデータベース。この場合、前者のオプションの使用は困難です。
于 2011-08-16T08:30:44.937 に答える
2

実際、スレッドを自分で停止することはお勧めしません。このstop()メソッドは非推奨です。最も簡単な解決策は、スレッドのメソッドwhile内のループでフラグを使用することです。run()スレッドを「停止」する必要がある場合は、フラグをfalseにドロップするだけで、スレッドは実行を継続しますが、それ以上何も実行しません。Androidは、必要なときにスレッドを停止します。お役に立てれば。

于 2011-08-15T18:19:58.480 に答える
1

この質問に1つまたは2つのスレッドがあるかどうかはわかりませんが、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を呼び出したときに、スレッドは引き続きその処理を実行します。その後、ゲームに戻ると、スレッドが再度作成されようとするため、問題が発生します。スレッドを適切に強制終了する方法は2つあります。

  • スレッドのwhile()ループで、コードを実行するブール値の「run」をwhile(run)実行します。runをfalseに変更すると、スレッドは終了します。
  • スレッドがスリープしている場合(ゲーム以降はスリープしている可能性があり、時間どおりに実行されると思います)、をキャッチしてInterruptedExceptionそこで終了します。スレッドを強制終了する場合は、スレッドに例外をスローします。

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

于 2011-08-25T00:55:56.147 に答える
1

コードの詳細を知らなくても。

スレッドを「一時停止」するには、次のような機能を実装できます。

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

これはDo something、サーフェスビューを無効にするか、アプリの進行を制御するかによって異なります。のアクセサpausedは、他のアーキテクチャに巻き込まれることなく、スレッドを一時停止および再開できるようにする必要があります。

于 2011-08-25T11:41:17.223 に答える