我的程序在后台线程中执行一些网络活动.在开始之前,它会弹出一个进度对话框.该对话框在处理程序上被关闭.这一切都很好,除非在对话框启动时屏幕方向发生变化(后台线程正在运行).此时,应用程序崩溃或死锁,或进入一个奇怪的阶段,在应用程序完全无法工作之前,直到所有线程都被杀死.
如何优雅地处理屏幕方向变化?
下面的示例代码大致匹配我的真实程序:
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) 我的主要活动有一些代码,可以进行一些不应该被中断的数据库更改.我正在另一个线程中进行繁重的工作,并使用我设置为不可取消的进度对话框.但是,我注意到如果我旋转手机,它会重新启动对正在运行的进程非常不好的活动,并且我会收到强制关闭.
我想要做的是以编程方式禁用屏幕方向更改,直到我的进程完成,此时方向更改已启用.
我有一个应用程序,显示大量的文本供用户阅读.
我发现躺下时读书时,即使我的头和屏幕对齐,我仍然对屏幕旋转感到恼火.
我不想将它设置为永久处于纵向模式,所以我认为这将排除设置的方法
android:screenOrientation="portrait"
Run Code Online (Sandbox Code Playgroud)
在清单中.
理想情况下,我想通过首选项页面启用/禁用自动方向更改.
什么是我最好的方法?
在Android中,当屏幕方向发生变化时(在横向和纵向之间),onCreate会调用该方法,如果处理不当,则会在结果过于简单地更改布局并保留所有相同信息时重新创建整个活动.
我知道有几种方法可以解决这个问题,但我对最有效的方式感兴趣.
1)通过覆盖onConfigurationChanged()方法并将其留空来告诉清单我将处理方向更改.
2)覆盖onSaveInstanceState()并保存此处要重新填充的数据onCreate()
3)覆盖onPause()将创建数据包并将其发送到onSaveInstanceState()
显然,这些都是选项,但哪一个是更好的做法(小,中,大量数据)
谢谢
android screen rotation screen-orientation orientation-changes
我有一个活动,其中有一个旋转器.因为对于纵向和横向模式,我有不同的布局,所以我在onConfigurationChanged方法中改变布局
@Override
public void onConfigurationChanged(Configuration conf) {
super.onConfigurationChanged(conf);
setContentView(R.layout.layout);
initUI();
}
Run Code Online (Sandbox Code Playgroud)
但问题是当我改变方向时,我的微调器被重新创建,所以如果微调器在纵向模式下打开它在横向模式下接近.我的要求是:如果它在任何模式下打开,它应该在方向改变后打开.你可以请让我知道如何处理这种情况.