我知道之前已经问过这个问题,但是没有提供答案。我也试过寻找其他地方,跟踪了函数调用并检查了所有内容,但我无法弄清楚答案。 我有一个非常简单的Handler,它每秒调用一个Runnable变量。它旨在跟踪活动所花费的时间。
因此处理程序在onCreate中开始调用,而在Runnable中有一个postDelayed(runnableVar,1000)继续每秒运行一次。这是在更新活动中的文本视图。
文本视图显示双打中的所有内容。我检查了我的日志,发现runnable被调用了两次。我不知道为什么会这样。这是我的代码:
//My runnable variable in the activity
private Runnable mUpdateTimeTask = new Runnable(){
@Override
public void run(){
if (gameTimer != null) {
Log.d("UPDATERUNNABLE", "Inside runnable run");
gameTimer.setText(getTime());
}
mHandler.postDelayed(this,1000);
}
};
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.d(TRIALTAG,"Inside on create");
startMins = mPrefsMin; //This is set in onPause and retrieved onResume
startSecs = mPrefsSecs;
Log.d(TRIALTAG,"Start mins : " + startMins + " Start Secs : " + startSecs);
mHandler.removeCallbacks(mUpdateTimeTask);
mHandler.post(mUpdateTimeTask);
}
private String getTime() {
String finalTime;
Log.d("GETTIME", "Start secs is : " + startSecs);
if(startSecs >= 60){
startSecs=0;
startMins++;
}
if(startSecs<10){
finalTime = startMins+":0"+startSecs;
}else{
finalTime = startMins+":"+startSecs;
}
startSecs++;
return finalTime;
}
@Override
protected void onPause(){
super.onPause();
Log.d(TRIALTAG,"On Pause CALLED");
mHandler.removeCallbacks(mUpdateTimeTask);
SharedPreferences.Editor ed = mPrefs.edit();
ed.putInt("my_mins", startMins);
ed.putInt("my_secs", startSecs);
ed.commit();
}
@Override
protected void onResume(){
super.onResume();
Log.d(TRIALTAG,"On RESUME CALLED");
if(gameTimer != null){
mPrefs = getSharedPreferences("mPrefs", MODE_PRIVATE);
mPrefsMin = mPrefs.getInt("my_mins", 0);
mPrefsSecs = mPrefs.getInt("my_secs", 0);
mHandler.post(mUpdateTimeTask);
}else{
mPrefsMin = 0;
mPrefsSecs = 0;
}
}
这一切都在我的活动课程中。我做错了什么?
答案 0 :(得分:3)
问题是您要以Runnable
和onCreate
方式两次发布onResume
个对象。尝试修改您的onResume
方法并删除之前添加的Runnable
@Override
protected void onResume(){
super.onResume();
Log.d(TRIALTAG,"On RESUME CALLED");
if(gameTimer != null){
mPrefs = getSharedPreferences("mPrefs", MODE_PRIVATE);
mPrefsMin = mPrefs.getInt("my_mins", 0);
mPrefsSecs = mPrefs.getInt("my_secs", 0);
mHandler.removeCallbacks(mUpdateTimeTask);
mHandler.post(mUpdateTimeTask);
}else{
mPrefsMin = 0;
mPrefsSecs = 0;
}
}
答案 1 :(得分:0)
还有另一种方法可用于在特定时间间隔更新UI。
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
try {
Thread.sleep(10000);
mHandler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
gameTimer.setText(getTime());
}
});
} catch (Exception e) {
// TODO: handle exception
}
}
}
}).start();
答案 2 :(得分:0)
删除
mHandler.removeCallbacks(mUpdateTimeTask);
mHandler.post(mUpdateTimeTask);