当设备的方向发生变化时,onCreate方法会一直被调用

时间:2012-01-12 17:48:07

标签: android android-activity android-asynctask screen-orientation oncreate

我的AsyncTaskonCreate()中被称为Main Activity。在相同的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);
    }
}

2 个答案:

答案 0 :(得分:3)

您应该检查Handling Run Time Changes

您可以使用

处理

在配置更改期间保留对象

允许您的活动在配置更改时重新启动,但会将有状态的对象带到您的活动的新实例。

自行处理配置更改

防止系统在某些配置更改期间重新启动您的活动,但在配置更改时收到回调,以便您可以根据需要手动更新活动。

在运行时配置更改期间保留对象:

重写 onRetainNonConfigurationInstance()方法以返回您想要保留的对象。

再次创建活动时,请调用 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();
    }
    ...
}

或者只是在您的Manifest of Activity中添加此代码

 android:screenOrientation="portrait" 

 android:screenOrientation="landscape" 

答案 1 :(得分:1)

您可以在活动清单中添加android:configChanges="orientation"并手动设置contentView或通过覆盖活动中的onConfigurationChanged方法来更改布局。