私のアプリケーションを研磨し、ユーザーが放置した後に再開するようになりました。アプリケーションが復元すると、私はIllegalThreadStateExceptionを取得します。これはかなり厄介です。この問題は、googleの例であるLunar Landerにあります。 surfaceViewを使用しているときに誰かが作業を復元する方法を見つけましたか?LunarLanderのAndroid IllegalThreadStateException
答えて
これは、サーフェスとアクティビティの処理方法の相違に起因すると考えられます。 LunarLanderアプリケーションを終了すると、サーフェスは破棄されます(surfaceDestroyedを呼び出す)が、アクティビティは一時停止(onPauseを呼び出す)するだけです。アクティビティが再開されると、サーフェスが作成され(surfaceCreatedを呼び出す)、描画スレッドを再び開始しようとします。
これは、スレッドの作成はアクティビティのライフサイクルで行われ、必ずしも対応しないSurfaceViewのライフサイクルでスレッドが破棄されるため、IllegalThreadStateExceptionが発生します。解決策は、スレッドを1つのライフサイクルまたは他のライフサイクルに結びつけることであり、両方を結合することではありません。
私はthis threadが解決策を提案していると思いますが、それがうまくいくかどうかわかりません。
私自身のテストでは、surfaceCreated()メソッドで描画スレッドを作成します。これにより、問題は完全に解決されます。これは私のメソッドの実装です:
@Override
public void surfaceCreated(SurfaceHolder arg0) {
_thread = new DrawThread(getHolder());
_thread.setRunning(true);
_thread.start();
}
だからsurfaceDestroyed()
が呼び出されるコードで、それがfalseにmRun
を設定し、thread.join()
を呼び出します。これにより、スレッドが完了して終了します。アプリが再び起動され、surfaceCreated()
が呼び出されると、thread.start()
が呼び出されます。これは、スレッドが終了した後にスレッドを開始できないため無効です。修正する
つのオプション:
A)surfaceCreated()
に新しいスレッドを開始します - 上記のように。
b)または、真の場合はスレッドを終了するには、surfaceDestroyed()
をActivity.isFinishing()
に対してチェックします。これを行うには、スレッド内のwhile(mRun)
を別のwhileループで囲みました。これは、isFinishing()
がtrueを返す場合にのみfalseに設定されます。
- 1. アンドロイドLunarLanderの例では、「無効化」
- 2. IllegalThreadStateException?スレッドに慣れていない
- 3. lunarlanderの例に関する簡単な質問
- 4. LunarLanderサンプルゲームのレイアウトを理解していません
- 5. なぜThread.interrupt()はIllegalThreadStateExceptionをスローするのですか?
- 6. `IllegalThreadStateException`を避けるexec-maven-pluginでデーモンを実行する
- 7. スレッドを避けるために作成する方法IllegalThreadStateException
- 8. ProcessBuilder - JavaでIllegalThreadStateExceptionエラーが発生するのはなぜですか?
- 9. BasicRobotを使用しているときにIllegalThreadStateExceptionが発生する
- 10. 私のゲームでCPUとLunarLanderが100%使用されないのはなぜですか?
- 11. デバイス 'emulator-5554'にapkをインストールできませんでした:タイムアウト
- 12. AndroidスタジオのAndroidウェアとAndroid TV
- 13. AndroidのポップアップウィンドウとAndroidのダイアログ
- 14. Androidスタジオのandroid-libraryのtestApt
- 15. アンドロイドアプリケーションの実行中に強制終了する
- 16. タブレットチュートリアル用のAndroid Androidグリッドウィジェット
- 17. Android AppへのAndroid WebApp
- 18. AndroidデバイスのAndroid Sqlite SELECTクエリエラー
- 19. PAHO MQTT Androidのクライアントは、Android
- 20. のAndroidメーカーAndroid Wearエラー
- 21. Android 3のAndroid互換パッケージ
- 22. xamarin AndroidモバイルデバイスのAndroidデプロイメント
- 23. Android - Android UIのデュアルListViewsフラグメント
- 24. Android SDKマネージャーAndroid SDKのno
- 25. Androidのjava.lang.OutOfMemoryError on Android 6.0
- 26. AndroidデバイスのAndroid FCM要件
- 27. のAndroid Studioの::のGradleスクリプトエラーのAndroid()
- 28. 私のAndroidアプリケーションのためのAndroid
- 29. プラグインのAndroidスタジオの例外Androidのサポート
- 30. すべてのAndroidの連絡先をAndroid用Androidで読む
リンクを試しても機能しません。私はsurfaceCreatedのスレッドをインスタンス化する必要がありますか?私はこれを試みたが、プログラムがクラッシュする。 –
リンクされたスレッドはあまり役に立たないようですが、Soonilが説明しているように、Surfaceライフタイムと一致するようスレッドの寿命を変更しました。 (私はLunarLanderでこれをやろうとしましたが、彼らはThreadオブジェクトにあまりにも多くのゲームロジックを持っているので、簡単な修正はありません。) – idbrii