LunarLanderでAndroidのないIllegalThreadStateException
-
22-08-2019 - |
質問
ちょうど私のアプリケーションを研磨し、ユーザが去った後、それが再開することに来ます。アプリケーションが復元されたとき、私は非常に迷惑ですないIllegalThreadStateExceptionを取得します。この問題は、Googleが月面着陸するの与え例に存在しています。誰もがsurfaceViewを使用するときに作業を復元する方法を発見していますか?
解決
私は、これは、表面とアクティビティの処理方法の格差から生じると考えています。あなたはLunarLanderアプリケーションを離れるとき、表面は(surfaceDestroyedを呼び出す)が破壊されたが、活動は(onPauseを呼び出す)だけ一時停止されています。アクティビティが再開されたときに表面が作成(surfaceCreatedを呼び出し)、それが再び描画スレッドを開始しようとしている。
これは、スレッドの作成が活動のライフサイクルで発生し、スレッドを破壊することは必ずしも対応しないSurfaceViewのライフサイクル、これないIllegalThreadStateExceptionで起こることを意味します。溶液を1点のライフサイクルまたは他のではなく、両方に糸を結ぶことであろう。
私は、私にはわからないけれどもこのスレッドには、可能な解決策を提案していると思いますそれが動作するかどうか。
他のヒント
私自身のテストでは、私はsurfaceCreated()メソッドで描画スレッドを作成し、これは完全に問題を解決します。これは私のメソッドの実装です。
@Override
public void surfaceCreated(SurfaceHolder arg0) {
_thread = new DrawThread(getHolder());
_thread.setRunning(true);
_thread.start();
}
surfaceDestroyed()
が呼び出されたときにだから、コードで、それはfalseにmRun
を設定し、thread.join()
を呼び出します。これが完了すると死ぬスレッドが発生します。アプリが再び開始され、surfaceCreated()
が呼び出されると、それはthread.start()
を呼び出します。それは死んだ後にスレッドが開始することができないので、これは無効です。
修正するには、2つのオプションます:
A)surfaceCreated()
に新しいスレッドを開始します - 上記のように
B)またはtrueの場合のみ、スレッドを終了しsurfaceDestroyed()
に対してActivity.isFinishing()
にチェックを追加します。これを行うために、私はwhile(mRun)
がtrueを返した場合にのみfalseに設定されている別のwhileループとスレッドでisFinishing()
を囲まれています。