2

クロノメーターの独自の実装を開発しました。私は次のことをしました:

  1. スレッドを実行する Runnable オブジェクトを使用するサービス (CronoService) を作成します。Runnable は 0.1 秒ごとにループします。

  2. Ui から Chronometer を開始、一時停止、または再開するためのメッセージを受信する Messenger オブジェクト。

  3. Runnable オブジェクトの各ループの後に時間をブロードキャストするインテント。

コードは次のとおりです。

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 秒ごとに少し時間が失われます。何か間違ったことをしていますが、問題が見つかりません。どうもありがとう。

編集 作業コードが更新されました。

4

1 に答える 1

1

私にとってうまくいった簡単な方法があります:Sistem.getCurrentMillis()

これを見てみましょう: Android: Chronometer with Milliseconds?

于 2011-11-14T08:27:29.910 に答える