2013-04-26 111 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

相關問題