Android 由于窗口管理器的原因,旋转手机时应用程序崩溃
我的android应用程序在大多数情况下都能正常工作,但有时会在手机旋转时崩溃,我会在下面看到错误日志,我不明白。有人能解释为什么会这样吗 以下是错误日志:Android 由于窗口管理器的原因,旋转手机时应用程序崩溃,android,view,Android,View,我的android应用程序在大多数情况下都能正常工作,但有时会在手机旋转时崩溃,我会在下面看到错误日志,我不明白。有人能解释为什么会这样吗 以下是错误日志: 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.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)
更新
以下是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();
}
}
以下是stacktrace中的两个相关行:
com.example.chartviewer.JsonActivity$getChartItems.onPostExecute(JsonActivity.java:267)
您已经实现了AsyncTask的onPostExcecute方法。此方法正在取消对话框:
android.app.Dialog.dismiss(Dialog.java:302)
旋转设备时,AsyncTask将继续运行并试图隐藏一个不再可见的对话框。以下是stacktrace中的两行相关内容:
com.example.chartviewer.JsonActivity$getChartItems.onPostExecute(JsonActivity.java:267)
您已经实现了AsyncTask的onPostExcecute方法。此方法正在取消对话框:
android.app.Dialog.dismiss(Dialog.java:302)
当您旋转设备时,AsyncTask将继续运行并试图隐藏一个不再可见的对话框。要扩展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
}
}
扩展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
}
}
一些代码会很有用。看起来您正试图排除getChartItems中已丢失/分离的拨号。onPostExecute@sandrstar使用代码更新。考虑使用<代码>加载程序< /代码>和<代码> LoaderManager < /代码>和/或<代码>片段<代码> >代码> StestRealStaseTrue(true)< /Cuff>集合。任何一个都将在配置更改的另一端“重新连接”到活动。一些代码将很有用。看起来您正试图排除getChartItems中已丢失/分离的拨号。onPostExecute@sandrstar使用代码更新。考虑使用<代码>加载程序< /代码>和<代码> LoaderManager < /代码>和/或<代码>片段<代码> >代码> StestRealStaseTrue(true)< /Cuff>集合。任何一个都将“重新连接”到配置更改另一端的活动。您好,我不知道自己如何管理配置。在配置更改的情况下,是否最好关闭进度对话框?当设备旋转时,活动将被销毁并重新创建。请看一看这个问题,我想什么能解决你的问题:注意这个解决方案只对旋转有帮助。AsyncTask可能会在应用程序处于后台时继续运行(例如,当有呼叫传入时),因此您总是希望在关闭对话框之前检查对话框是否可见。@Maver1ck只是想澄清一下,如果我只处理活动的一个方向,则无需正确处理旋转?当然。本主题仅在希望支持两种方向时才相关。我不确定自己如何管理配置。在配置更改的情况下,是否最好关闭进度对话框?当设备旋转时,活动将被销毁并重新创建。请看一看这个问题,我想什么能解决你的问题:注意这个解决方案只对旋转有帮助。AsyncTask可能会在应用程序处于后台时继续运行(例如,当有呼叫传入时),因此您总是希望在关闭对话框之前检查对话框是否可见。@Maver1ck只是想澄清一下,如果我只处理活动的一个方向,则无需正确处理旋转?当然。此主题仅在希望支持两种方向时才相关