2013-04-26 112 views
3

我知道此问题之前已被询问,但未提供任何答案。我也尝试寻找其他地方,追踪函数调用并检查了所有内容,但我无法弄清楚答案。我有一个非常简单的Handler,每秒调用一次Runnable变量。这是为了跟踪活动花费的时间。Android处理程序调用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; 
    } 
} 

所有这些都在我的活动课内。我究竟做错了什么??

回答

3

问题是,您正在张贴Runnable对象两次 - onCreateonResume方法。尝试修改您的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; 
    } 
} 
+0

非常感谢。无论是解决方案还是指出我犯的错误。我对Android仍然陌生,而且这些事情对我来说应该比现在更加明显:| ..接受为答案。 – KVNam 2013-04-26 07:16:55

+0

如果您在onResume中调用removeCallbacks,则无需在onCreate中发布 – pskink 2013-04-26 07:26:05

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(); 
+0

感谢您的解决方案,尽管它不直接回答我的问题,但我相信这将对未来有所帮助.. :) – KVNam 2013-04-26 07:18:37

+0

@monologish hmm感谢您对我的回答的建议 – 2013-04-26 07:20:07

0

中的onCreate删除

mHandler.removeCallbacks(mUpdateTimeTask); 
mHandler.post(mUpdateTimeTask); 
+0

感谢您的解答。必须先给vmironov回答,并解释原因。 – KVNam 2013-04-26 07:17:49

相关问题