0

これは私のコードです:

public class BFragment extends SherlockFragment {

private Button start;
private View v;
private Button reset;
private Button pause;
private TextView hourTextView;
private TextView minTextView;
private TextView secTextView;
private int secondCounter;
private int minuteCounter;
private int hourCounter;
private Thread timerThread;
private boolean continueThread = false;
private boolean isRunning = false;



@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // Inflate the layout for this fragment

    v = inflater.inflate(R.layout.activity_bfragment, container, false);
    start = (Button) v.findViewById(R.id.start); 
    pause = (Button) v.findViewById(R.id.pause);
    reset = (Button) v.findViewById(R.id.reset);
    hourTextView = (TextView) v.findViewById(R.id.hh);
    minTextView = (TextView) v.findViewById(R.id.mm);
    secTextView = (TextView) v.findViewById(R.id.ss);



    start.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            if (isRunning) {

            } else {
                continueThread = true;
                timeUpdate();   
                isRunning = true;
                isRunning = true;
            }
        }
    });

    pause.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            continueThread = false;
            isRunning = false;
            start.setText("Resume");
            isRunning = false;
        }
    });

    reset.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            hourTextView.setText("00");
            minTextView.setText("00");
            secTextView.setText("00");
            hourCounter = 0;
            secondCounter = 0;
            minuteCounter = 0;
            continueThread = false;
            isRunning = false;
        }
    });


    return v;

}

final Handler mHandlerUpdateSec = new Handler();
final Runnable mUpdateSec = new Runnable() {
    public void run() {
        String temp = "" + secondCounter;
        System.out.println("Temp second counter length: " + temp.length());
        if(temp.length() == 1)
            secTextView.setText("0" + secondCounter);
        else
            secTextView.setText("" + secondCounter);
    }
};
final Handler mHandlerUpdateMinute = new Handler();
final Runnable mUpdateMinute= new Runnable() {
    public void run() {
        String temp = "" + minuteCounter;
        System.out.println("Temp second counter length: " + temp.length());
        if(temp.length() == 1)
            minTextView.setText("0" + minuteCounter);
        else
            minTextView.setText("" + minuteCounter);
    }
};
final Handler mHandlerUpdateHour = new Handler();
final Runnable mUpdateHour = new Runnable() {
    public void run() {
        String temp = "" + hourCounter;
        System.out.println("Temp second counter length: " + temp.length());
        if(temp.length() == 1)
            hourTextView.setText("0" + hourCounter);
        else
            hourTextView.setText("" + hourCounter);
    }
};

public void timeUpdate()
{
    timerThread = new Thread(new Runnable() {

        public void run() {
            while(continueThread){
                Date newDate = new Date();
                Date date = new Date();
                System.out.println(newDate.getTime() - date.getTime());
                if(true){
                    secondCounter = secondCounter+1;
                    mHandlerUpdateSec.post(mUpdateSec);
                    System.out.println("Inside the Theread ..."+secondCounter);
                    if(secondCounter > 59){
                        minuteCounter = minuteCounter + 1;
                        mHandlerUpdateMinute.post(mUpdateMinute);
                        secondCounter = 0;
                        if(minuteCounter > 59){
                            hourCounter = hourCounter + 1;
                            mHandlerUpdateHour.post(mUpdateHour);
                            minuteCounter = 0;
                        }
                    }
            }
        }
    });
    timerThread.start();
}
}

ユーザーがスタート/一時停止を非常に速く (ほぼ同時に) 押すと、クロノは速くカウントアップし、秒をスキップします... 一時停止が押されるまで停止せず、再び正常に動作しますか? その理由とそれを防ぐ方法は?

ありがとう!

4

1 に答える 1

0

まず第一に、コードに遅延はありません。あなたのtimeUpdate()基本的にこれをやっています:

while(continueThread){
    secondCounter = secondCounter+1;
    // ... display the counter ...
}

アプリをリアルタイム クロックに結び付けるには、何かを行う必要があります。簡単な方法は、ループを通過するたびに経過時間を計算して表示することです。簡単な最適化は、コードにいくつかのチェックを入れて、変更されたかどうかを確認することです。さらに効率的にするには、スレッドをスピンする代わりにスリープ状態にすることができます。

ただし、カウンターが変わるたびに表示を再描画することに集中するのではなく、向きを変えることをお勧めします。人間の言葉で言えば、ユーザーが更新を確認する時が来るまで待って何もしないでください。(これは 1 秒ごとでも、10 秒ごとでもかまいません。) ユーザーに新しい更新を表示するときが来たら、タイムスタンプを見て、経過時間を測定し、ディスプレイに書き込みます。

于 2012-07-23T19:47:08.940 に答える