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 ...
}

您需要做一些事情来将您的应用程序与实时时钟联系起来。一种简单的方法是计算每次通过循环的经过时间并显示出来。一个简单的优化是在你的代码中进行一些检查,看看事情是否发生了变化。为了更高效,您可以让您的线程 sleep 而不是spin

不过,我想建议,不要专注于每次计数器更改时重新绘制显示,而是将其转过来。等待并且什么也不做,直到从人类的角度来说,是时候让您的用户看到更新了。(这可能是每秒,每十分之一秒,等等。)当是时候向您的用户展示新的更新时,请查看您的时间戳,测量经过的时间,并将其写入您的显示器。

于 2012-07-23T19:47:08.940 回答