2010-02-24 11 views
7

मेरे पास पृष्ठभूमि में एक सेवा चल रही है। जब भी यह शुरू होता है मैं स्मृति में मिलीसेकेंड में शुरू करने के लिए समय की दुकान:एंड्रॉइड: एक लगातार स्टॉपवॉच के रूप में क्रोनोमीटर। शुरुआती समय कैसे सेट करें? क्रोनोमीटर "बेस" क्या है?

startingTime = new Date().getTime(); 

मैं एक घड़ी है कि गणना शुरू कर प्रदर्शित करने के लिए सेवा प्रारंभ हो और कभी नहीं बंद हो जाता है जब तक उपयोगकर्ता एक बटन दबाता है चाहता हूँ। मैं उपयोगकर्ता को क्रोनोमीटर को प्रस्तुत करने वाली गतिविधि छोड़ने की अनुमति देना चाहता हूं, कुछ सामान करता हूं और फिर वापस आ जाता हूं। लेकिन विचार यह है कि जब उपयोगकर्ता लौटाता है तो मैं नहीं चाहता कि क्रोनोमीटर फिर से 0:00 पर जाए। इंस्टीट्यूट मैं चाहता हूं कि सेवा शुरू होने के बाद से यह सही समय दिखाना पड़े।

elapsedTime = new Date().getTime() - startingTime; 

बात मुझे नहीं है कि पता है कि उस समय से गिनती शुरू करने के लिए ठीक घड़ी बताने के लिए है:

मैं हर बार ठीक घड़ी गतिविधि के उपयोगकर्ता वापसी elapsedTime गणना कर सकते हैं!

इसे क्रोनोमीटर आधार के रूप में सेट करना काम नहीं करता है। क्या कोई समझ सकता है कि वास्तव में "आधार" का अर्थ क्या है या इसे कैसे पूरा किया जाए?

बहुत बहुत धन्यवाद! BYE

उत्तर

20

आप Chronometer का उपयोग कर सकते हैं।

आपको this thread भी जांचना चाहिए।

संपादित करें: समाधान:

public class ChronoExample extends Activity { 
Chronometer mChronometer; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    LinearLayout layout = new LinearLayout(this); 
    layout.setOrientation(LinearLayout.VERTICAL); 

    mChronometer = new Chronometer(this); 

    // Set the initial value 
    mChronometer.setText("00:10"); 
    layout.addView(mChronometer); 

    Button startButton = new Button(this); 
    startButton.setText("Start"); 
    startButton.setOnClickListener(mStartListener); 
    layout.addView(startButton); 

    Button stopButton = new Button(this); 
    stopButton.setText("Stop"); 
    stopButton.setOnClickListener(mStopListener); 
    layout.addView(stopButton); 

    Button resetButton = new Button(this); 
    resetButton.setText("Reset"); 
    resetButton.setOnClickListener(mResetListener); 
    layout.addView(resetButton);   

    setContentView(layout); 
} 

private void showElapsedTime() { 
    long elapsedMillis = SystemClock.elapsedRealtime() - mChronometer.getBase();    
    Toast.makeText(ChronoExample.this, "Elapsed milliseconds: " + elapsedMillis, 
      Toast.LENGTH_SHORT).show(); 
} 

View.OnClickListener mStartListener = new OnClickListener() { 
    public void onClick(View v) { 
     int stoppedMilliseconds = 0; 

     String chronoText = mChronometer.getText().toString(); 
     String array[] = chronoText.split(":"); 
     if (array.length == 2) { 
      stoppedMilliseconds = Integer.parseInt(array[0]) * 60 * 1000 
       + Integer.parseInt(array[1]) * 1000; 
     } else if (array.length == 3) { 
      stoppedMilliseconds = Integer.parseInt(array[0]) * 60 * 60 * 1000 
       + Integer.parseInt(array[1]) * 60 * 1000 
       + Integer.parseInt(array[2]) * 1000; 
     } 

     mChronometer.setBase(SystemClock.elapsedRealtime() - stoppedMilliseconds); 
     mChronometer.start(); 
    } 
}; 

View.OnClickListener mStopListener = new OnClickListener() { 
    public void onClick(View v) { 
     mChronometer.stop(); 
     showElapsedTime(); 
    } 
}; 

View.OnClickListener mResetListener = new OnClickListener() { 
    public void onClick(View v) { 
     mChronometer.setBase(SystemClock.elapsedRealtime()); 
     showElapsedTime(); 
    } 
}; 
} 
+0

हाँ मैं पहले से ही है कि देखा है और यह कोशिश की, लेकिन ठीक घड़ी हमेशा resseted हो जाता है ... यह 0:00 किसी भी समय शुरू होता है है! मैं भी यह एक निरंतर मूल्य 0:00 की तुलना में अलग से शुरू कर सकते। – Santiago

+0

ग्रेट उत्तर दोस्त !!! बहुत बहुत धन्यवाद !!!! – Arun

+0

धन्यवाद Macarse .... मैं सही इस लिए देख रहा था ... मैं इस पर कई घंटे बिताए हैं .... धन्यवाद दोस्त – shripal

4

आधार समय समय है कि Chronometer पर टिक टिक शुरू कर दिया है। आप इसे Chronometer.setBase() का उपयोग कर सेट कर सकते हैं। आपको SystemClock.getElapsedTime() का उपयोग करके आधार का समय प्राप्त करना चाहिए। प्रत्येक बार Chronometer शुरू होने पर प्रारंभ समय के साथ setBase() पर कॉल करें। यदि Activity को नष्ट करने और टाइमर अभी भी सक्रिय होने पर पुनर्निर्मित करने की संभावना है तो आपको Activity के बाहर कहीं भी आधार समय पकड़ना होगा, जो Chronometer का मालिक है।

1

SystemClock.getElapsedTime() के साथ कुछ अजीब है, मैं आरंभ तिथि के साथ का उपयोग कर सामान्य के लिए कुछ परिवर्तन किया था,

myChron.setBase(startDate.getTime()); 

यहाँ नीचे घड़ी की बच्चे की तरह, TimeView

import android.R; 
import android.content.Context; 
import android.content.res.TypedArray; 
import android.os.Handler; 
import android.os.Message; 
import android.os.SystemClock; 
import android.text.format.DateUtils; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.widget.Chronometer; 
import android.widget.RemoteViews; 

import java.util.Formatter; 
import java.util.IllegalFormatException; 
import java.util.Locale; 

@RemoteViews.RemoteView 
public class TimeView extends Chronometer { 
    private static final String TAG = "TimeView"; 

    private long mBase; 
    private boolean mVisible; 
    private boolean mStarted; 
    private boolean mRunning; 
    private boolean mLogged; 
    private String mFormat; 
    private Formatter mFormatter; 
    private Locale mFormatterLocale; 
    private Object[] mFormatterArgs = new Object[1]; 
    private StringBuilder mFormatBuilder; 
    private OnChronometerTickListener mOnChronometerTickListener; 
    private StringBuilder mRecycle = new StringBuilder(8); 

    private static final int TICK_WHAT = 2; 

    /** 
    * Initialize this Chronometer object. 
    * Sets the base to the current time. 
    */ 
    public TimeView(Context context) { 
     this(context, null, 0); 
    } 

    /** 
    * Initialize with standard view layout information. 
    * Sets the base to the current time. 
    */ 
    public TimeView(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    /** 
    * Initialize with standard view layout information and style. 
    * Sets the base to the current time. 
    */ 
    public TimeView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(); 
    } 

    private void init() { 
     mBase = System.currentTimeMillis(); 
     updateText(mBase); 
    } 

    public void setBase(long base) { 
     mBase = base; 
     dispatchChronometerTick(); 
     updateText(System.currentTimeMillis()); 
    } 

    /** 
    * Return the base time as set through {@link #setBase}. 
    */ 
    public long getBase() { 
     return mBase; 
    } 

    public void start() { 
     mStarted = true; 
     updateRunning(); 
    } 

    /** 
    * Stop counting up. This does not affect the base as set from {@link #setBase}, just 
    * the view display. 
    * <p/> 
    * This stops the messages to the handler, effectively releasing resources that would 
    * be held as the chronometer is running, via {@link #start}. 
    */ 
    public void stop() { 
     mStarted = false; 
     updateRunning(); 
    } 

    /** 
    * The same as calling {@link #start} or {@link #stop}. 
    * 
    * @hide pending API council approval 
    */ 
    public void setStarted(boolean started) { 
     mStarted = started; 
     updateRunning(); 
    } 

    @Override 
    protected void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
     mVisible = false; 
     updateRunning(); 
    } 

    @Override 
    protected void onWindowVisibilityChanged(int visibility) { 
     super.onWindowVisibilityChanged(visibility); 
     mVisible = visibility == VISIBLE; 
     updateRunning(); 
    } 

    private synchronized void updateText(long now) { 
     long seconds = now - mBase; 
     seconds /= 1000; 
     String text = DateUtils.formatElapsedTime(mRecycle, seconds); 

     if (mFormat != null) { 
      Locale loc = Locale.getDefault(); 
      if (mFormatter == null || !loc.equals(mFormatterLocale)) { 
       mFormatterLocale = loc; 
       mFormatter = new Formatter(mFormatBuilder, loc); 
      } 
      mFormatBuilder.setLength(0); 
      mFormatterArgs[0] = text; 
      try { 
       mFormatter.format(mFormat, mFormatterArgs); 
       text = mFormatBuilder.toString(); 
      } catch (IllegalFormatException ex) { 
       if (!mLogged) { 
        Log.w(TAG, "Illegal format string: " + mFormat); 
        mLogged = true; 
       } 
      } 
     } 
     setText(text); 
    } 

    private void updateRunning() { 
     boolean running = mVisible && mStarted; 
     if (running != mRunning) { 
      if (running) { 
       updateText(System.currentTimeMillis()); 
       dispatchChronometerTick(); 
       mHandler.sendMessageDelayed(Message.obtain(mHandler, TICK_WHAT), 1000); 
      } else { 
       mHandler.removeMessages(TICK_WHAT); 
      } 
      mRunning = running; 
     } 
    } 

    private Handler mHandler = new Handler() { 
     public void handleMessage(Message m) { 
      if (mRunning) { 
       updateText(System.currentTimeMillis()); 
       dispatchChronometerTick(); 
       sendMessageDelayed(Message.obtain(this, TICK_WHAT), 1000); 
      } 
     } 
    }; 

    void dispatchChronometerTick() { 
     if (mOnChronometerTickListener != null) { 
      mOnChronometerTickListener.onChronometerTick(this); 
     } 
    } 
} 

की प्रतिलिपि बना उपयोग , यह मेरे लिए काम करता है

+0

तुम क्या आप ढांचे का क्रोनोमीतर वर्ग के कार्यान्वयन में बदल दिया है समझा सकते हैं? – faizal

+0

http://stackoverflow.com/a/19774399/2590478 – MidasLefko

2

क्रोनोमीटर शुरू करने के लिए आपको SystemClock.elapsedRealTime() के साथ अपने क्रोनोमीटर की setBase() विधि का उपयोग करना चाहिए। बस इस तरह:

mChronometer.setBase(SystemClock.elapsedRealTime()) 

लेकिन अगर आप किसी अन्य समय पर शुरू करना चाहते हैं, तो आप समय आप मिलीसेकेंड में चाहते घटाना है।जाता है कि घड़ी "00:00" समय से पहले इसे शुरू दिखाएगा

mChronometer.setBase(SystemClock.elapsedRealTime() - 2*60*1000); 

लेकिन समस्या यह है यहां: 2 मिनट पर

mChronometer.setBase(SystemClock.elapsedRealTime() - 10*1000); 

: उदाहरण के लिए, आप 10 सेकंड में अपने घड़ी शुरू करना चाहते हैं गिनती करने के लिए, अपने समय के लिए इसे बदलने के लिए आपको लगता है कि क्या करना है:

mChronometer.setText("02:00"); 
0

यह मेरे लिए काम करता है:

Date now = new Date(); 
long elapsedTime = now.getTime() - startTime.getTime(); //startTime is whatever time you want to start the chronometer from. you might have stored it somwehere 
myChronometer.setBase(SystemClock.elapsedRealtime() - elapsedTime); 
myChronometer.start(); 
1

आप .setBase साथ basetime सेट करते हैं (SystemClock.elapsedRealTime()) chronomether 00.00 से गिनती करने के लिए शुरू होता है, लेकिन समय यह संग्रहीत करता है बूट से milisecs की राशि है। जब आप .stop का उपयोग आंतरिक गिनती नहीं रुकती, बस समय आप घड़ी पर देखते हैं। इसलिए, यदि आप फिर से शुरू करते हैं। स्टार्ट गिनती वास्तविक गिनती पर कूद जाती है। यदि आप शुरुआत से गुजरने वाले समय को स्टोर करना चाहते हैं, तो आपको सिस्टम को समय बीतना होगा और .setTime

+0

कोई सुझाव हम यह कैसे लागू कर सकते हैं? SystemClock.elapsedRealtime() - mElapsedTime; काम नहीं कर रहा – AndroidGuy

1

प्रारंभ समय कैसे सेट करें? क्रोनोमीटर "बेस" क्या है?

उपयोग इस उद्देश्य के लिए SystemClock.elapsedRealtime():

myChronometer.setBase(SystemClock.elapsedRealtime()); 
संबंधित मुद्दे