1

ウィンドウがビューアに表示されてから時間を取得する機能を設定しようとしています。

ハンドラー、タイマー、currenttimemillis を使用しています。

私が成功したこと。ウィンドウは、ウィンドウがユーザーに表示されてからの継続時間を示しています - 更新頻度は 40 fps で、見た目と動作が気に入っています..

しかし!

ウィンドウを前後に移動すると、時間が再スタートします。ユーザーの最初のビューからの(実行中の)時間をウィンドウに表示したいのですが、プログラムが停止していても時間が「壊れた」ことは望ましくありません。

文字列を保存するために sharedpreferences を使用していますが、最初の System.currentTimeMillis(); を保存しようとしました。sharedpreference として (long として)、この if ステートメントを使用して oncreate に再度ロードする


SharedPreferences sData14;
private final int REFRESH_RATE = 25;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.orderwaiting); 
    setupVariables(); 
    sData14 = getSharedPreferences(filename, 0);

}

private void setupVariables() { 
    mHandler.removeCallbacks(startTimer);
    mHandler.postDelayed(startTimer, 0);

       if (sData14 == null) {
              starttime = System.currentTimeMillis();

             sData14 = getSharedPreferences(filename, 0); 
             SharedPreferences.Editor editor = sData14.edit();      
             editor.putLong("sharedString14", starttime);                       
             editor.commit();
           };

          if (sData14 != null) {
              Long value_long = sData14.getLong("sharedString14", 1000000);
              starttime = value_long;       
              }; 

編集済み 追加済み

onresume と onpause は使用しません。私はそれをしなければなりませんか?

ifステートメントが「ケース」を処理することを期待します..そして、プログラムが「閉じられた」ケースを処理する関数が必要ですが、時間内にどれだけ到達したかを追跡するために関数が必要です。

バックグラウンドで実行し、別の場所からも呼び出せるようにした方がよいでしょうか?


共有データをロードしないだけです...

つまり、ユーザーが最初にこのウィンドウを表示したときから使用する動的な番号が必要です。多分私もこれを行うことができる他の方法がありますか??

私はそれが「このように」動作するはずだと思います..しかし、私はそれを動作させることができないようです..

問題を簡単な方法で設定できたことを願っています。


解決

long startTime;
private final int REFRESH_RATE = 25;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.orderwaiting); 
setupVariables();     

}

private void setupVariables() { 

   SharedPreferences sData14 = getSharedPreferences(filename, 0);
   startTime = sData14.getLong("sharedString14", -1);
   **starttime = startTime;**

   if(startTime == -1){
       //startTime not previously saved
       starttime = System.currentTimeMillis();           

       SharedPreferences.Editor editor = sData14.edit();      
       editor.putLong("sharedString14", starttime);                       
       editor.commit();
   }

    mHandler.removeCallbacks(startTimer);
    mHandler.postDelayed(startTimer, 0);

starttime = startTime を追加しました。そうしないと、2 番目のビューに starttime が読み込まれないためです。David に感謝します。

4

1 に答える 1

0

ああ、最初の質問を誤解していました。好みをチェックする方法は正しくありません。かなり単純化することもできます。以下のコードはあなたの問題を解決するはずです:

long startTime;
private final int REFRESH_RATE = 25;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.orderwaiting); 
setupVariables();     

}

private void setupVariables() { 

   SharedPreferences sData14 = getSharedPreferences(filename, 0);
   startTime = sData14.getLong("sharedString14", -1);

   if(startTime == -1){
       //startTime not previously saved
       starttime = System.currentTimeMillis();           

       SharedPreferences.Editor editor = sData14.edit();      
       editor.putLong("sharedString14", starttime);                       
       editor.commit();
   }

    mHandler.removeCallbacks(startTimer);
    mHandler.postDelayed(startTimer, 0);
}
于 2012-05-02T07:07:03.913 に答える