Android活动刷新轮换



我是一个经验丰富的.NET开发人员,但这是我的第一个Android应用程序,它让我抓狂!

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

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

以下是我接下来尝试的内容;我把这门课改成了对外的。活动将其Context传递给类,并且onProgressUpdate&onPostExecute在上下文上运行公共函数以更新活动的UI。再说一遍,这很好用,直到你旋转它…Aaaagh!

然而,我发现async类仍在运行,但UI没有改变,因为(我认为)该活动现在与async类引用的上下文不同

这就是我现在的处境。每种解决方案都能解决一个问题;创建另一个。我是需要以某种方式保持上下文,还是开始追逐自己的尾巴?

如有任何帮助,我们将不胜感激!

Ta。Barry

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();
}

不要逐字逐句地复制这段代码,代码中缺少一些细节/假设会有所不同,但它可能看起来像这样。

然而,我发现async类仍在运行,但UI没有改变,因为(我认为)该活动现在与async类引用的上下文不同

不错的猜测。如果您想保留计算的数据,就必须处理Activity's lifecycle,因为每当您旋转设备时,活动都会被重新创建,因此onCreate()会被调用,而不会保存以前的计算数据。您必须覆盖onSaveInstanceState(Bundle savedInstanceState)onRestoreInstanceState()才能保存您的计算。看看活动的生命周期文档和Reto Meier的回答,我认为它会解决你的问题。

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");

最新更新