旋转时Android活动刷新

时间:2015-02-25 22:29:34

标签: android android-activity android-asynctask android-context

我是一位经验丰富的.NET开发者,但这是我的第一款Android应用,它让我疯狂!

这是一个可以正常工作的倒数计时器,但是当你旋转屏幕时,它会重新初始化活动,使活动归零并停止倒计时。

这就是我的尝试; 我删除了CountDownTimer对象,而是创建了一个活动内部的类,它扩展了AsyncTask,因此它在一个单独的线程上运行......没有变化。 我认为作为一个内部课程,它正在重新开始活动。

这是我接下来要做的事情; 我把课程变成了外部课程。 Activity将其Context传递给类和onProgressUpdate& onPostExecute在上下文中运行公共函数以更新活动的UI。 再次,这可以正常工作,直到你旋转它... Aaaargh!

但是,我发现异步类仍在运行,但UI没有改变,因为(我认为)活动现在具有与异步类引用的不同的上下文。

这就是我所在的地方。每个解决方案都解决了一个问题。创造另一个。 我是否需要以某种方式维持上下文,或者我是否开始追逐自己的尾巴?

感谢任何帮助!

的Ta。 百里

3 个答案:

答案 0 :(得分:2)

CountDownTimer工具onTick

@Override
public void onTick(long millisUntilFinished) {
    // something like this:
    this.millisUntilFinished = millisUntilFinished;
}

Activity工具onSaveInstanceState

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // something like this:
    savedInstanceState.putLong("millisUntilFinished", millisUntilFinished);
}

也在onCreateonStart重新设置CountDownTimer

@Override
public void onCreate(Bundle savedInstanceState) {
    // ...

    if (savedInstanceState != null) {
        millisUntilFinished = savedInstanceState.getLong("millisUntilFinished");
    }

}

@Override
public void onStart() {
    super.onStart();
    timer = new MyCountDownTimer(millisUntilFinished, 100); 
    timer.start();
}

不要逐字复制此代码,在代码中会有一些细节遗漏/假设不同,但它可能看起来像这样。

答案 1 :(得分:1)

  

但是,我发现异步类仍在运行,但UI没有改变,因为(我认为)活动现在具有与异步类引用的不同的上下文。

很好的猜测。您必须处理Activity's lifecycle,如果您想保留计算数据,因为无论何时旋转设备,活动都会重新创建,因此onCreate()被称为而不会保存以前的计算数据。您必须覆盖onSaveInstanceState(Bundle savedInstanceState)onRestoreInstanceState()才能保存计算。看看Activity's LifeCycle documentationReto Meier's answer,我认为它可以解决您的问题。

答案 2 :(得分:1)

Try_me34的解决方案很好,但是还有一些其他方法可以保存和恢复数据(不能将它们发布为评论):

尝试重写onPause方法并将进程保存到辅助类(可能是Timer),然后将其恢复为覆盖onResume

另一种选择是将其保存为首选项:

SharedPreferences.Editor editor = getSharedPreferences("nameOfFile", MODE_PRIVATE).edit();
editor.putInt("name", value);
editor.putString("nameForString", value);

然后加载它:

SharedPreferences prefs = getSharedPreferences("nameOfFile", MODE_PRIVATE);
int i = prefs.getInt("tag", 0);
String s = prefs.getString("tag", "defaultValue");