java - Android: CountDownTimer skips last onTick()! -



java - Android: CountDownTimer skips last onTick()! -

code:

public class smh extends activity { public void oncreate(bundle b) { super.oncreate(b); setcontentview(r.layout.main); textview tv = (textview) findviewbyid(r.id.tv); new countdowntimer(10000, 2000) { public void ontick(long m) { long sec = m/1000+1; tv.append(sec+" seconds remain\n"); } public void onfinish() { tv.append("done!"); } }.start(); }

output: 10 seconds remain 8 seconds remain 6 seconds remain 4 seconds remain done!

problem:

how show "2 seconds remain"? time elapsed indeed 10 seconds, lastly ontick() never happens. if alter sec parameter 2000 1000, output:

10 seconds remain 9 seconds remain 8 seconds remain 7 seconds remain 6 seconds remain 5 seconds remain 4 seconds remain 3 seconds remain 2 seconds remain done!

so see, seems skipping lastly ontick() call. , btw, xml file default main.xml textview assigned id tv , text set "".

i don't know why lastly tick not working can create own timer runable , example.

class mycountdowntimer { private long millisinfuture; private long countdowninterval; public mycountdowntimer(long pmillisinfuture, long pcountdowninterval) { this.millisinfuture = pmillisinfuture; this.countdowninterval = pcountdowninterval; } public void start() { final handler handler = new handler(); log.v("status", "starting"); final runnable counter = new runnable(){ public void run(){ if(millisinfuture <= 0) { log.v("status", "done"); } else { long sec = millisinfuture/1000; log.v("status", long.tostring(sec) + " seconds remain"); millisinfuture -= countdowninterval; handler.postdelayed(this, countdowninterval); } } }; handler.postdelayed(counter, countdowninterval); } }

and start it,

new mycountdowntimer(10000, 2000).start();

edit goofy's question

you should have variable hold counter status (boolean) . can write stop() method start().

edit-2 goofy's question

actually there no bug on stopping counter there bug on start 1 time again after stop(resume).

i'm writing new updated total code had tried , it's working. it's basic counter show time on screen start , stop button.

class counter

public class mycountdowntimer { private long millisinfuture; private long countdowninterval; private boolean status; public mycountdowntimer(long pmillisinfuture, long pcountdowninterval) { this.millisinfuture = pmillisinfuture; this.countdowninterval = pcountdowninterval; status = false; initialize(); } public void stop() { status = false; } public long getcurrenttime() { homecoming millisinfuture; } public void start() { status = true; } public void initialize() { final handler handler = new handler(); log.v("status", "starting"); final runnable counter = new runnable(){ public void run(){ long sec = millisinfuture/1000; if(status) { if(millisinfuture <= 0) { log.v("status", "done"); } else { log.v("status", long.tostring(sec) + " seconds remain"); millisinfuture -= countdowninterval; handler.postdelayed(this, countdowninterval); } } else { log.v("status", long.tostring(sec) + " seconds remain , timer has stopped!"); handler.postdelayed(this, countdowninterval); } } }; handler.postdelayed(counter, countdowninterval); } }

activity class

public class counteractivity extends activity { /** called when activity first created. */ textview timetext; button startbut; button stopbut; mycountdowntimer mycounter; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); timetext = (textview) findviewbyid(r.id.time); startbut = (button) findviewbyid(r.id.start); stopbut = (button) findviewbyid(r.id.stop); mycounter = new mycountdowntimer(20000, 1000); refreshtimer(); } public void starttimer(view v) { log.v("startbutton", "saymaya basladi"); mycounter.start(); } public void stoptimer(view v) { log.v("stopbutton", "durdu"); mycounter.stop(); } public void refreshtimer() { final handler handler = new handler(); final runnable counter = new runnable(){ public void run(){ timetext.settext(long.tostring(mycounter.getcurrenttime())); handler.postdelayed(this, 100); } }; handler.postdelayed(counter, 100); } }

main.xml

<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:weightsum="1"> <textview android:textappearance="?android:attr/textappearancelarge" android:text="textview" android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/time"> </textview> <button android:text="start" android:id="@+id/start" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onclick="starttimer"> </button> <button android:text="stop" android:id="@+id/stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onclick="stoptimer"> </button> </linearlayout>

java android timer countdown countdowntimer

Comments

Popular posts from this blog

How do I check if an insert was successful with MySQLdb in Python? -

delphi - blogger via idHTTP : error 400 bad request -

postgresql - ERROR: operator is not unique: unknown + unknown -