首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

求教关于timer的有关问题

2012-06-25 
求教关于timer的问题Java codepackage Y.Bimport java.util.ArrayListimport java.util.Listimport jav

求教关于timer的问题

Java code
package Y.B;import java.util.ArrayList;import java.util.List;import java.util.Timer;import java.util.TimerTask;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.ListView;import android.widget.RadioButton;import android.widget.RadioGroup;import android.widget.TextView;public class stopwatchActivity extends Activity implements OnClickListener {    RadioGroup rg;    RadioButton rbfenbei, rbyiquan;    ListView lvjilu;    TextView tvxianshi;    Button btnjishi, btnkaishi;    Timer timer = new Timer();    TimerTask task = new TimerTask() {        @Override        public void run() {            try {                Message msg = handler.obtainMessage();                msg.what = 0;                run[3]++;                if(run[3] == 100) {                    run[3] = 0;                    run[2]++;                }                if(run[2] == 60) {                    run[2] = 0;                    run[1]++;                }                if(run[1] == 60) {                    run[1] = 0;                    run[0]++;                }                Thread.sleep(10);                msg.obj = run[3];                msg.sendToTarget();            }            catch(Exception e) {                e.printStackTrace();            }        }    };    List<String> jilu = new ArrayList<String>();    ArrayAdapter<String> jilus;    Handler handler = new Handler() {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            switch(msg.what) {                case 0:// 显示时间                    tvxianshi.setText((run[0] < 10 ? "0" + run[0] : run[0])                            + ":" + (run[1] < 10 ? "0" + run[1] : run[1]) + ":"                            + (run[2] < 10 ? "0" + run[2] : run[2]) + ":"                            + (run[3] < 10 ? "0" + run[3] : run[3]));                    break;            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.stopwatch);        rg = (RadioGroup) findViewById(R.id.rg);        rbfenbei = (RadioButton) findViewById(R.id.rbfenbie);        rbyiquan = (RadioButton) findViewById(R.id.rbyiquan);        lvjilu = (ListView) findViewById(R.id.lvjilu);        tvxianshi = (TextView) findViewById(R.id.tvxianshi);        btnjishi = (Button) findViewById(R.id.btnjishi);        btnkaishi = (Button) findViewById(R.id.btnkaishi);        btnkaishi.setOnClickListener(this);        btnjishi.setOnClickListener(this);        jilus = new ArrayAdapter<String>(stopwatchActivity.this,                android.R.layout.simple_list_item_1, jilu);        lvjilu.setAdapter(jilus);    }    boolean isRun = false;// 是否在计时    int[] run = { 0, 0, 0, 0 };// 表示时间的时、分、秒、毫秒    @Override    public void onClick(View v) {        switch(v.getId()) {            case R.id.btnkaishi:                if(!isRun) {                    timer.schedule(task, 10, 10);                    isRun = true;                }else{}                break;            case R.id.btnjishi:                int[] one = run.clone();                String myjilu = (one[0] < 10 ? "0" + one[0] : one[0]) + ":"                        + (one[1] < 10 ? "0" + one[1] : one[1]) + ":"                        + (one[2] < 10 ? "0" + one[2] : one[2]) + ":"                        + (one[3] < 10 ? "0" + one[3] : one[3]);                jilu.add(myjilu);                jilus.notifyDataSetChanged();                break;        }    }} 


我想写个秒表程序
我这样写了后运行2分钟里就有近20秒的误差
请问如果想做这样的一个程序应该怎么写?

[解决办法]
使用系统时间,不要依赖于timer的回调及Thread.sleep
timer回调仅仅是为了刷新

Java code
private boolean stoped;private long start;private long end;private Handler handler = new Handler() {    @Override    public void handleMessage(Message msg) {        refresh();    }};private Thread thread;public void start() {    start = System.currentTimeMillis();    stoped = false;    (thread = new Thread() {        @Override        public void run() {            while (true) {                handler.sendEmptyMessage(0);                try {                    sleep(10);                } catch (InterruptedException e) {                    break;                }            }        }    }).start();}public void stop() {    if (thread != null) {        end = System.currentTimeMillis();        stoped = true;        thread.interrupt();        thread = null;    }}public void refresh() {    long time;    if(stoped)    {        time = end - start;    }    else    {        time = System.currentTimeMillis() - start;    }    //    //将毫秒时间 time 转为合适的格式,显示到界面上    //} 

热点排行