【问题标题】:onCreate method keeps getting called when the orientation of device changes当设备的方向发生变化时,onCreate 方法会不断被调用
【发布时间】:2012-01-12 17:48:06
【问题描述】:
我有一个AsyncTask,在我的Main Activity 中称为onCreate()。在同一个Activity 中,如果方向改变,AsyncTask 会再次被调用。如何防止这种情况发生或如何重组我的程序以避免发生这种情况?
public class Main extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pages);
StartProcess sProcess = new StartProcess();
sProcess.execute(this);
}
}
【问题讨论】:
标签:
android
android-activity
android-asynctask
screen-orientation
oncreate
【解决方案1】:
你应该检查Handling Run Time Changes
您可以使用
在配置更改期间保留对象
允许您的活动在配置更改时重新启动,但将有状态的对象携带到您的活动的新实例。
自行处理配置更改
防止系统在某些配置更改期间重新启动您的 Activity,但在配置发生更改时接收回调,以便您可以根据需要手动更新您的 Activity。
在运行时配置更改期间保留对象:
重写 onRetainNonConfigurationInstance() 方法 以返回您想要保留的对象。
当您的 Activity 再次创建时,调用 getLastNonConfigurationInstance() 来恢复您的对象。
@Override
public Object onRetainNonConfigurationInstance() {
final MyDataObject data = collectMyLoadedData();
return data;
}
保留在 OnCreate 中;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance();
if (data == null) {
data = loadMyData();
}
...
}
或者只是在你的活动清单中添加这段代码
android:screenOrientation="portrait"
或
android:screenOrientation="landscape"
【解决方案2】:
您可以在 Activity 清单中添加 android:configChanges="orientation" 并手动设置 contentView 或通过覆盖 Activity 中的 onConfigurationChanged 方法来更改布局。