2011-07-08 22 views
0

私のアプリに問題があり、電話で中断された場合やホームキーが押されたときに強制終了されます。ユーザーがアプリに戻ると、強制終了メッセージが表示されます。私は以下の質問を読んで、答えに答えました:Force Close when opening app after pressing home buttonとここに:Android crash when app is closed and reopened。 2番目の質問に回答がありませんでした。私がwait()を追加すると、アプリが開かれたときに強制終了され、notify()を追加するとアプリケーションを終了したときに強制終了されました。私はアイデアがなくなり、誰もがこの問題の解決策を持っているかどうかを見ています。再開時の強制終了

私は、LunarLanderで使用されているsurfaceCreated &のsurfaceDestroyedメソッドでサーフェスビューを使用しています。

ありがとうございました。

LogCat:

Log1:<br> 
07-08 02:18:32.284: ERROR/AndroidRuntime(627): Uncaught handler: thread main exiting due to uncaught exception 
07-08 02:18:32.354: ERROR/AndroidRuntime(627): java.lang.IllegalThreadStateException: Thread already started. 
07-08 02:18:32.354: ERROR/AndroidRuntime(627):  at java.lang.Thread.start(Thread.java:1322) 
07-08 02:18:32.354: ERROR/AndroidRuntime(627):  at com.android.hitmanassault.HitmanView.surfaceCreated(HitmanView.java:115) 
07-08 02:18:32.354: ERROR/AndroidRuntime(627):  at android.view.SurfaceView.updateWindow(SurfaceView.java:454) 
07-08 02:18:32.354: ERROR/AndroidRuntime(627):  at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:189) 
07-08 02:18:32.354: ERROR/AndroidRuntime(627):  at android.view.View.dispatchWindowVisibilityChanged(View.java:3782) 
07-08 02:18:32.354: ERROR/AndroidRuntime(627):  at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:692) 
07-08 02:18:32.354: ERROR/AndroidRuntime(627):  at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:692) 
07-08 02:18:32.354: ERROR/AndroidRuntime(627):  at android.view.ViewRoot.performTraversals(ViewRoot.java:706) 
07-08 02:18:32.354: ERROR/AndroidRuntime(627):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1633) 
07-08 02:18:32.354: ERROR/AndroidRuntime(627):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-08 02:18:32.354: ERROR/AndroidRuntime(627):  at android.os.Looper.loop(Looper.java:123) 
07-08 02:18:32.354: ERROR/AndroidRuntime(627):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
07-08 02:18:32.354: ERROR/AndroidRuntime(627):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-08 02:18:32.354: ERROR/AndroidRuntime(627):  at java.lang.reflect.Method.invoke(Method.java:521) 
07-08 02:18:32.354: ERROR/AndroidRuntime(627):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
07-08 02:18:32.354: ERROR/AndroidRuntime(627):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
07-08 02:18:32.354: ERROR/AndroidRuntime(627):  at dalvik.system.NativeStart.main(Native Method) 

LOG2:

07-08 02:21:39.805: ERROR/AndroidRuntime(663): Uncaught handler: thread main exiting due to uncaught exception 
07-08 02:21:39.854: ERROR/AndroidRuntime(663): java.lang.IllegalMonitorStateException: object not locked by thread before notify() 
07-08 02:21:39.854: ERROR/AndroidRuntime(663):  at java.lang.Object.notify(Native Method) 
07-08 02:21:39.854: ERROR/AndroidRuntime(663):  at com.android.hitmanassault.HitmanView.surfaceDestroyed(HitmanView.java:135) 
07-08 02:21:39.854: ERROR/AndroidRuntime(663):  at android.view.SurfaceView.reportSurfaceDestroyed(SurfaceView.java:488) 
07-08 02:21:39.854: ERROR/AndroidRuntime(663):  at android.view.SurfaceView.updateWindow(SurfaceView.java:413) 
07-08 02:21:39.854: ERROR/AndroidRuntime(663):  at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:189) 
07-08 02:21:39.854: ERROR/AndroidRuntime(663):  at android.view.View.dispatchWindowVisibilityChanged(View.java:3782) 
07-08 02:21:39.854: ERROR/AndroidRuntime(663):  at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:692) 
07-08 02:21:39.854: ERROR/AndroidRuntime(663):  at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:692) 
07-08 02:21:39.854: ERROR/AndroidRuntime(663):  at android.view.ViewRoot.performTraversals(ViewRoot.java:706) 
07-08 02:21:39.854: ERROR/AndroidRuntime(663):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1633) 
07-08 02:21:39.854: ERROR/AndroidRuntime(663):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-08 02:21:39.854: ERROR/AndroidRuntime(663):  at android.os.Looper.loop(Looper.java:123) 
07-08 02:21:39.854: ERROR/AndroidRuntime(663):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
07-08 02:21:39.854: ERROR/AndroidRuntime(663):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-08 02:21:39.854: ERROR/AndroidRuntime(663):  at java.lang.reflect.Method.invoke(Method.java:521) 
07-08 02:21:39.854: ERROR/AndroidRuntime(663):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
07-08 02:21:39.854: ERROR/AndroidRuntime(663):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
07-08 02:21:39.854: ERROR/AndroidRuntime(663):  at dalvik.system.NativeStart.main(Native Method) 

SurfaceDestroyed方法:

public void surfaceDestroyed(SurfaceHolder holder) { 
     Log.d(TAG, "Surface is being destroyed"); 
     boolean retry = true; 
     thread.setRunning(false); 
     thread.notify(); 
     while (retry) { 
      try { 
       thread.join(); 
           //thead.notify(); ---I would get rid of the join part 
       retry = false; 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }    
     } 
     Log.d(TAG, "Thread was shut down cleanly"); 
    } 

SurfaceCreated方法:

public void surfaceCreated(SurfaceHolder holder) { 
     thread.initLevel(); 
     thread.setRunning(true);  
     thread.start(); 
       //thread.notify();  
    } 

EDIT:
私はnotify、waitで切り替えを試行したところで参加しました。私も試しに通知を入れて、どこに参加するのか待ってみました。

+0

あなたはLogCatからエラーを取得していただけますか? –

答えて

2

強制終了するアプリケーションは、常にlogcatバッファに見えるスタックトレースを生成します。あなたのアプリが強制終了した場合、スタックトレースの先頭にはクラッシュを引き起こした行番号をマークする、アプリケーション内のクラスの1つが含まれます。

何が問題になったかを調べるには、その行番号を調査します。 (より詳細な回答については、質問を更新してクラッシュにつながるstacktrace +コードを含めることもできます)。

適切な例外処理&コーディングを使用すると、アプリケーションでクラッシュすることはほとんどありませんアンドロイドサブシステムがあなたのアプリをダウンさせる)。

あなたの場合、いくつかのスレッドの問題があります。

同じスレッドを2回起動することはできません。スレッドで待機を呼び出す前にnotifyを呼び出すことはできません。また、wait()、notify()、notifyAll()を呼び出すことも、同期メソッド/ブロックで行う必要があります。 (詳細はこれを参照してください。http://www.xyzws.com/Javafaq/why-wait-notify-notifyall-must-be-called-inside-a-synchronized-method-block/127

私はまた、Javaでの同時実行性に関するいくつかの読書を行うことをお勧め:http://www.javaconcurrencyinpractice.com/

+0

助けてくれてありがとう、今私はそれをどう扱うかをよりよく理解しています。 – Manji

関連する問題