3

この質問が以前に尋ねられたことは知っていますが、答えはありませんでした。他の場所も調べてみましたが、関数呼び出しを追跡してすべてをチェックしましたが、答えがわかりません。Runnable 変数を毎秒呼び出す非常に単純な Handler があります。アクティビティに費やした時間を追跡することを目的としています。

そのため、ハンドラーは onCreate で呼び出しを開始し、Runnable には、毎秒実行し続けるための postDelayed(runnableVar, 1000) があります。これは、アクティビティ内のテキスト ビューを更新しています。

テキスト ビューでは、すべてが double で表示されます。ログを確認したところ、ランナブルが 2 回呼び出されていることがわかりました。なぜこれが起こっているのかわかりません。これが私のコードです:

//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;
    }
}

これはすべて私の活動クラス内にあります。私は何を間違っていますか??

4

3 に答える 3

3

問題は、Runnableオブジェクトを 2 回投稿していることです。メソッドを変更して、以前に追加したものを削除してみてくださいonCreateonResumeonResumeRunnable

@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;
    }
}
于 2013-04-26T07:00:33.843 に答える
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();
于 2013-04-26T07:04:11.820 に答える
0

onCreateで削除

mHandler.removeCallbacks(mUpdateTimeTask);
mHandler.post(mUpdateTimeTask);
于 2013-04-26T07:06:39.407 に答える