我的程序在后台线程中执行一些网络活动.在开始之前,它会弹出一个进度对话框.该对话框在处理程序上被关闭.这一切都很好,除非在对话框启动时屏幕方向发生变化(后台线程正在运行).此时,应用程序崩溃或死锁,或进入一个奇怪的阶段,在应用程序完全无法工作之前,直到所有线程都被杀死.
如何优雅地处理屏幕方向变化?
下面的示例代码大致匹配我的真实程序:
public class MyAct extends Activity implements Runnable {
public ProgressDialog mProgress;
// UI has a button that when pressed calls send
public void send() {
mProgress = ProgressDialog.show(this, "Please wait",
"Please wait",
true, true);
Thread thread = new Thread(this);
thread.start();
}
public void run() {
Thread.sleep(10000);
Message msg = new Message();
mHandler.sendMessage(msg);
}
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
mProgress.dismiss();
}
};
}
Run Code Online (Sandbox Code Playgroud)
堆:
E/WindowManager( 244): Activity MyAct has …Run Code Online (Sandbox Code Playgroud) AsyncTask 在另一个线程中运行复杂任务是一件好事.
但是当AsyncTask仍在运行时有方向更改或其他配置更改时,将Activity消除并重新启动电流.并且当实例AsyncTask连接到该活动时,它会失败并导致"强制关闭"消息窗口.
所以,我正在寻找某种"最佳实践"来避免这些错误并防止AsyncTask失败.
到目前为止我看到的是:
onRetainNonConfigurationInstanceActivity并Activity在再次创建时重新启动它.一些代码示例:
屏幕旋转期间的Android AsyncTasks,第一部分和第二部分
你能帮我找到最好的方法来解决问题并且易于实现吗?代码本身也很重要,因为我不知道如何正确解决这个问题.
我有以下一些例外情况:
java.lang.IllegalArgumentException: View not attached to window manager
at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:355)
at android.view.WindowManagerImpl.updateViewLayout(WindowManagerImpl.java:191)
at android.view.Window$LocalWindowManager.updateViewLayout(Window.java:428)
at android.app.Dialog.onWindowAttributesChanged(Dialog.java:596)
at android.view.Window.setDefaultWindowFormat(Window.java:1013)
at com.android.internal.policy.impl.PhoneWindow.access$700(PhoneWindow.java:86)
at com.android.internal.policy.impl.PhoneWindow$DecorView.drawableChanged(PhoneWindow.java:1951)
at com.android.internal.policy.impl.PhoneWindow$DecorView.fitSystemWindows(PhoneWindow.java:1889)
at android.view.ViewRoot.performTraversals(ViewRoot.java:727)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4338)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
我用谷歌搜索它,看到它与弹出窗口和转动屏幕有关,但没有引用我的代码.
问题是:
如果我正确地解释了这篇文章,那么将活动上下文传递AsyncTasks给潜在的泄漏,因为在任务仍在运行时活动可能会被销毁.
你是如何处理这一点的AsyncTasks,不是内部的,需要访问资源或更新UI?
另外,如果需要引用进度对话框来解除它们,如何避免泄露上下文?
我已经阅读了一些博客并访问了一些网站.我想知道在生命周期中哪一个事件只被触发了一次.在阅读博客后,我意识到该onCreate()方法在生命周期中只被触发一次.我不知道我是对还是错.现在我的问题是,我想解雇任何只有在我改变横向或纵向方向时触发一次的事件,而不是这个事件没有被触发意味着如果用户改变方向而不是未被触发的事件.我想知道在启动Activity之后哪个事件只触发了一次.这个onCreate()