我的程序在后台线程中执行一些网络活动.在开始之前,它会弹出一个进度对话框.该对话框在处理程序上被关闭.这一切都很好,除非在对话框启动时屏幕方向发生变化(后台线程正在运行).此时,应用程序崩溃或死锁,或进入一个奇怪的阶段,在应用程序完全无法工作之前,直到所有线程都被杀死.
如何优雅地处理屏幕方向变化?
下面的示例代码大致匹配我的真实程序:
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) 使用案例:
用户启动将加载验证码的应用程序.用户填写验证码并尝试下载一些信息.
问题:
如果用户在下载时旋转设备Activity则被销毁.在执行结束时,AsyncTask正在尝试更新被破坏的内容Activity,结果是"View not attached to window manager".
"错误的"解决方案:
我可以用a掩盖问题,android:configChanges="orientation|keyboardHidden|screenSize"但是这样布局不会更新为横向.
我在问什么:
是否可以更改方向并更改传递给上下文的"参考" AsyncTask?
这个答案建议检查对话框是否为空,但它不是我正在寻找的.
在这里,他建议使用WeakReference(这里有一个关于如何使用它的好片段),但我不明白它是否是我正在寻找的.
更明确一点,这就是我在onPostExecute中所做的:
@Override
protected void onPostExecute(Auto result) {
progress.dismiss();
new DownloaderCaptcha(context).execute("");
((EditText)context.findViewById(R.id.editTextCaptcha)).setText("");
context.findViewById(R.id.progrBar).setVisibility(View.VISIBLE);
context.findViewById(R.id.captcha).setVisibility(View.INVISIBLE);
if(result != null) {
Storage.storeHistory(context, result.getTarga().getValue());
Intent i = new Intent(context, MenuActivity.class);
i.putExtra("result", result);
context.startActivity(i);
} else {
ErrorDialog.show(context, error);
}
}
Run Code Online (Sandbox Code Playgroud) 我需要在Android应用程序中处理方向更改.为此我决定使用OrientationEventListener便利课.但他的回调方法给出了一些奇怪的行为.
我的应用程序以纵向模式启动,然后最终切换到lanscape.我在回调onOrientationChanged方法中执行了一些自定义代码,它提供了一些额外的UI处理逻辑 - 它有几个调用findViewById.奇怪的是,当从横向切换回纵向模式时,onOrientationChanged回调被调用两次,更糟糕的是 - 第二次调用处理错误 Context - findViewById方法开始返回null.这些调用是从MainThread进行的
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
listener = new OrientationListener();
}
@Override
protected void onResume() {
super.onResume();
// enabling listening
listener.enable();
}
@Override
protected void onPause() {
super.onPause();
// disabling listening
listener.disable();
}
Run Code Online (Sandbox Code Playgroud)
我用一个Activity没有任何逻辑的假人复制了相同的行为,除了一个处理定向哈希的人.我通过按Ctrl + F11从Android 2.2模拟器启动方向切换
可能有什么问题?
Upd:实现的内部类 OrientationEventListener
private class OrientationListener extends OrientationEventListener {
public OrientationL() {
super(getBaseContext());
}
@Override
public …Run Code Online (Sandbox Code Playgroud) android screen-orientation android-emulator android-2.2-froyo
您能否解释一下当应用程序出现对话框时调用哪个活动生命周期方法?我很困惑它是调用onResume()还是onPause()方法.
谢谢