我是一位经验丰富的.NET开发者,但这是我的第一款Android应用,它让我疯狂!
这是一个可以正常工作的倒数计时器,但是当你旋转屏幕时,它会重新初始化活动,使活动归零并停止倒计时。
这就是我的尝试; 我删除了CountDownTimer对象,而是创建了一个活动内部的类,它扩展了AsyncTask,因此它在一个单独的线程上运行......没有变化。 我认为作为一个内部课程,它正在重新开始活动。
这是我接下来要做的事情; 我把课程变成了外部课程。 Activity将其Context传递给类和onProgressUpdate& onPostExecute在上下文中运行公共函数以更新活动的UI。 再次,这可以正常工作,直到你旋转它... Aaaargh!
但是,我发现异步类仍在运行,但UI没有改变,因为(我认为)活动现在具有与异步类引用的不同的上下文。
这就是我所在的地方。每个解决方案都解决了一个问题。创造另一个。 我是否需要以某种方式维持上下文,或者我是否开始追逐自己的尾巴?
感谢任何帮助!
的Ta。 百里
答案 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);
}
也在onCreate
和onStart
重新设置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 documentation和Reto 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");