Android Chronometer自己实现

时间:2011-11-14 08:13:46

标签: android service handler runnable chronometer

我开发了一个自己的计时器实现。我做了以下事情:

  1. 创建一个服务(CronoService),它使用一个执行该线程的Runnable对象。 Runnable将每0.1秒循环一次。

  2. 将从Ui接收消息以启动,暂停或恢复计时器的Messenger对象。

  3. 将在Runnable对象的每个循环之后广播时间的意图。

  4. 代码是:

    public class CronoService extends Service {
    
    public static final int PARAR = 0;
    public static final int EMPEZAR = 1;
    public static final int ESTABLECER_TIEMPO = 2;
    
    private static final String TAG = "BroadcastService";
    
    public static final String BROADCAST_ACTION = "jose.planilla.mostrartiempo";
    final Messenger mMessenger = new Messenger(new IncomingHandler());
    
    private final Handler handler = new Handler();
    private Intent intent;
    private long mDec;
    private long mTotalMilis;
    private long mLastMilis;
    private long mElapsedTime;
    private long mCurrentMilis;
    private int mSeconds;
    private int mMin;
    
    private Runnable sendUpdatesToUI = new Runnable() {
        public void run() {
            mCurrentMilis = System.currentTimeMillis();
            mElapsedTime = mCurrentMilis - mLastMilis;
            mLastMilis = mCurrentMilis;
            mTotalMilis += mElapsedTime;
            DisplayLoggingInfo();
            handler.postDelayed(this, 100); // 0.1 seconds
            Log.d("run()", String.valueOf(mTotalMilis));
        }
    };  
    
    
    
    @Override
    public void onCreate(){
        super.onCreate();
    
        intent = new Intent(BROADCAST_ACTION);
    
    }
    
    @Override
    public void onStart(Intent intent, int startId){
        mTotalMilis = intent.getLongExtra("milis", 0);
        handler.removeCallbacks(sendUpdatesToUI);
        handler.postDelayed(sendUpdatesToUI, 100); // 0.1 second 
    }
    
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStart()");
        mLastMilis = mElapsedTime = System.currentTimeMillis(); 
        mTotalMilis = intent.getLongExtra("milis", 0);
        handler.removeCallbacks(sendUpdatesToUI);
        DisplayLoggingInfo();
        //handler.postDelayed(sendUpdatesToUI, 100); // 0.1 second 
    
        return START_NOT_STICKY;
    }    
    
    @Override
    public IBinder onBind(Intent arg0) {
        return mMessenger.getBinder();
    }
    
    
    private void DisplayLoggingInfo() { 
        String tiempo;
    
        mDec = mTotalMilis % 1000;
        mDec = mDec / 100;
        mSeconds = (int) (mTotalMilis / 1000);
        mMin = mSeconds / 60;
        mSeconds = mSeconds % 60;
        tiempo = "" + mDec;
    
        if(mSeconds < 10)
            tiempo = ":0" + mSeconds + "." + tiempo;
        else
            tiempo = ":" + mSeconds + "." + tiempo; 
    
        if(mMin < 10 )
            tiempo = "0" + mMin + tiempo;
        else
            tiempo = mMin + tiempo;
    
        intent.putExtra("tiempo", tiempo);
        intent.putExtra("milis", mTotalMilis);
        sendBroadcast(intent);
    }
    
    @Override
    public void onDestroy() {       
        handler.removeCallbacks(sendUpdatesToUI);
        super.onDestroy();
    }
    
    public void pause(){
        handler.removeCallbacks(sendUpdatesToUI);
    }
    
    public void resume(){
        handler.postDelayed(sendUpdatesToUI, 100);
    }
    
    class IncomingHandler extends Handler {
        @Override
        public void handleMessage(Message msg){ 
            switch(msg.what) {
                case PARAR:
                    pause();
                    break;
                case EMPEZAR:
                    resume();
                    break;
                case ESTABLECER_TIEMPO: 
                    mTotalMilis = (Long) msg.obj;
                    break;
                default:
                    super.handleMessage(msg);
            }
        }
    }
    

    我的问题是我的计时器比正常计时器慢一点。它每秒都会耗费一点时间。 我做错了什么,但我找不到问题。 非常感谢。

    修改 工作代码已更新。

1 个答案:

答案 0 :(得分:1)

对我来说有一种更简单的方法:玩Sistem.getCurrentMillis()

看看这个: Android: Chronometer with Milliseconds?