2013-02-22 2 views
0

Приложение для моего andorid прекрасно работает в большинстве случаев, но иногда сбой при повороте телефона, я получаю журнал ошибок, ниже которого я не понимаю. Может ли кто-нибудь объяснить, почему это происходит?Приложение сбой при повороте телефона из-за диспетчера окон

Вот журнал ошибок:

02-22 14:44:52.175: D/AndroidRuntime(26784): Shutting down VM 
02-22 14:44:52.175: W/dalvikvm(26784): threadid=1: thread exiting with uncaught exception (group=0x40e81300) 
02-22 14:44:52.183: E/AndroidRuntime(26784): FATAL EXCEPTION: main 
02-22 14:44:52.183: E/AndroidRuntime(26784): java.lang.IllegalArgumentException: View not attached to window manager 
02-22 14:44:52.183: E/AndroidRuntime(26784): at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:653) 
02-22 14:44:52.183: E/AndroidRuntime(26784): at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:349) 
02-22 14:44:52.183: E/AndroidRuntime(26784): at android.view.WindowManagerImpl$CompatModeWrapper.removeView(WindowManagerImpl.java:160) 
02-22 14:44:52.183: E/AndroidRuntime(26784): at android.app.Dialog.dismissDialog(Dialog.java:319) 
02-22 14:44:52.183: E/AndroidRuntime(26784): at android.app.Dialog.dismiss(Dialog.java:302) 
02-22 14:44:52.183: E/AndroidRuntime(26784): at com.example.chartviewer.JsonActivity$getChartItems.onPostExecute(JsonActivity.java:267) 
02-22 14:44:52.183: E/AndroidRuntime(26784): at com.example.chartviewer.JsonActivity$getChartItems.onPostExecute(JsonActivity.java:1) 
02-22 14:44:52.183: E/AndroidRuntime(26784): at android.os.AsyncTask.finish(AsyncTask.java:631) 
02-22 14:44:52.183: E/AndroidRuntime(26784): at android.os.AsyncTask.access$600(AsyncTask.java:177) 
02-22 14:44:52.183: E/AndroidRuntime(26784): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
02-22 14:44:52.183: E/AndroidRuntime(26784): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-22 14:44:52.183: E/AndroidRuntime(26784): at android.os.Looper.loop(Looper.java:137) 
02-22 14:44:52.183: E/AndroidRuntime(26784): at android.app.ActivityThread.main(ActivityThread.java:4745) 
02-22 14:44:52.183: E/AndroidRuntime(26784): at java.lang.reflect.Method.invokeNative(Native Method) 
02-22 14:44:52.183: E/AndroidRuntime(26784): at java.lang.reflect.Method.invoke(Method.java:511) 
02-22 14:44:52.183: E/AndroidRuntime(26784): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
02-22 14:44:52.183: E/AndroidRuntime(26784): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
02-22 14:44:52.183: E/AndroidRuntime(26784): at dalvik.system.NativeStart.main(Native Method) 

Update

Вот код для на onPostExecuteMethod:

// Удаляет диалог выполнения, когда данные были

принес
 protected void onPostExecute(String args) { 
      progressDialog.dismiss(); 

      //Shows alert dialog if data is unavailable 
      if(args != null && args.equals(noData)){ 

       AlertDialog.Builder builder = new AlertDialog.Builder(JsonActivity.this); 
       builder.setIcon(R.drawable.artistlogo); 
       builder.setTitle("Musicmetric Charts"); 
       builder.setMessage(noData); 
       builder.setOnCancelListener(new DialogInterface.OnCancelListener() { 
        @Override 
        public void onCancel(DialogInterface dialog) { 
         // finishes the activity and leads back to the list of charts 
         JsonActivity.this.finish(); 

        } 

       }); 

       AlertDialog alert = builder.create(); 
       alert.show(); 

      } 



     } 
+0

Некоторый код будет полезным. Похоже, вы пытаетесь уволить уже испорченный/отсоединенный диалод в getChartItems.onPostExecute – sandrstar

+0

@sandrstar обновлен кодом. – AndroidEnthusiast

+0

Рассмотрите возможность использования 'Loader' и' LoaderManager' и/или 'Fragment' с' setRetainInstance (true) 'set. Любой из них будет «повторно привязан» к Activity на другой стороне изменения конфигурации. – Karakuri

ответ

0

расширить ответ ashtom в: попытаться сохранить вращение устройства самостоятельно:

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
if(newConfig.equals(Configuration.ORIENTATION_LANDSCAPE)){ 
     // TODO 
    }else if (newConfig.equals(Configuration.ORIENTATION_PORTRAIT)){ 
     // TODO 
    } 
} 
+0

привет, я не уверен, как самому управлять конфигурацией. В случае изменения конфигурации лучше всего отменить диалог прогресса? – AndroidEnthusiast

+0

Когда устройство повернуто, активность уничтожается и воссоздается. Пожалуйста, взгляните на этот вопрос, я думаю, что решит вашу проблему: http://stackoverflow.com/questions/7128670/best-practice-asynctask-during-orientation-change – Droidman

+0

Обратите внимание, что это решение помогает только для вращения. AsyncTask может продолжать работать, когда приложение находится в фоновом режиме (например, когда пришел вызов), поэтому вы всегда хотите проверить, видимо ли диалоговое окно, прежде чем отклонять его. – ashtom

4

Эти 2 соответствующие строки в вашем StackTrace:

com.example.chartviewer.JsonActivity$getChartItems.onPostExecute(JsonActivity.java:267) 

Вы реализовали метод onPostExcecute в качестве AsyncTask. Этот метод увольняет диалог:

android.app.Dialog.dismiss(Dialog.java:302) 

При повороте устройства, то AsyncTask продолжает работать и пытается скрыть диалоговое окно, которое не видно больше.

Смежные вопросы