欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 中不用线程如何实现倒计时

程序员文章站 2024-02-23 10:38:34
需求: 有多个组件可以开启倒计时,正常情况下默认倒计时时间终了后更新ui,另,用户可以取消指定倒计时。 这里使用countdowntimer进行倒计时,其中回调函数on...

需求:

有多个组件可以开启倒计时,正常情况下默认倒计时时间终了后更新ui,另,用户可以取消指定倒计时。

这里使用countdowntimer进行倒计时,其中回调函数onfinish是在倒计时终了时回调,ontick是在倒计时开始时回调,用户可以使用countdowntimer对象的cancel方法取消倒计时。

这样做的好处:不需要使用繁琐的线程去控制倒计时,更方便的进行ui更新。

上代码:

mainactivity

package test.demo.countdowntest;
import android.os.bundle;
import android.os.countdowntimer;
import android.support.v7.app.appcompatactivity;
import android.view.view;
import android.widget.button;
import android.widget.progressbar;
import android.widget.toast;
public class mainactivity extends appcompatactivity implements view.onclicklistener{
  private button bt1, bt2, bt3;
  private progressbar pb1, pb2, pb3;
  private mycount mc1,mc2, mc3;
  private boolean mc1click = false;
  private boolean mc2click = false;
  private boolean mc3click = false;
  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.activity_main);
    bt1 = ((button) findviewbyid(r.id.bt1));
    bt2 = ((button) findviewbyid(r.id.bt2));
    bt3 = ((button) findviewbyid(r.id.bt3));
    bt1.setonclicklistener(this);
    bt2.setonclicklistener(this);
    bt3.setonclicklistener(this);
    pb1 = ((progressbar) findviewbyid(r.id.pb1));
    pb2 = ((progressbar) findviewbyid(r.id.pb2));
    pb3 = ((progressbar) findviewbyid(r.id.pb3));
    mc1 = new mycount(30000, 1000);
    mc1.setpb(bt1, pb1);
    mc2 = new mycount(30000, 1000);
    mc2.setpb(bt2, pb2);
    mc3 = new mycount(30000, 1000);
    mc3.setpb(bt3, pb3);
  }
  @override
  public void onclick(view view) {
    switch (view.getid()) {
      case r.id.bt1:
        if (mc1click) {
          mc1.cancel();
          pb1.setvisibility(view.gone);
          mc1click = false;
        } else {
          pb1.setvisibility(view.visible);
          mc1.start();
          mc1click = true;
        }
        break;
      case r.id.bt2:
        if (mc2click) {
          pb2.setvisibility(view.gone);
          mc2.cancel();
          mc2click = false;
        } else {
          pb2.setvisibility(view.visible);
          mc2.start();
          mc2click = true;
        }
        break;
      case r.id.bt3:
        if (mc3click) {
          pb3.setvisibility(view.gone);
          mc3.cancel();
          mc3click = false;
        } else {
          pb3.setvisibility(view.visible);
          mc3.start();
          mc3click = true;
        }
        break;
    }
  }
  /*定义一个倒计时的内部类*/
  class mycount extends countdowntimer {
    button mbt;
    progressbar mpb;
    public mycount(long millisinfuture, long countdowninterval) {
      super(millisinfuture, countdowninterval);
    }
    public void setpb(button bt, progressbar pb) {
      mbt = bt;
      mpb = pb;
    }
    @override
    public void onfinish() {
      mpb.setvisibility(view.gone);
    }
    @override
    public void ontick(long millisuntilfinished) {
      mbt.settext("请等待30秒(" + millisuntilfinished / 1000 + ")...");
      toast.maketext(mainactivity.this, millisuntilfinished / 1000 + "", toast.length_long).show();
    }
  }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:id="@+id/activity_main"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingbottom="@dimen/activity_vertical_margin"
  android:paddingleft="@dimen/activity_horizontal_margin"
  android:paddingright="@dimen/activity_horizontal_margin"
  android:paddingtop="@dimen/activity_vertical_margin"
  android:orientation="vertical"
  tools:context="cn.sh.changxing.countdowntest.mainactivity">
  <linearlayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <button
      android:id="@+id/bt1"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_weight="1"
      android:text="测试启动1"/>
    <progressbar
      android:id="@+id/pb1"
      style="?android:attr/progressbarstylesmall"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="center"
      android:indeterminate="true"/>
  </linearlayout>
  <linearlayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <button
      android:id="@+id/bt2"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_weight="1"
      android:text="测试启动2"/>
    <progressbar
      android:id="@+id/pb2"
      style="?android:attr/progressbarstylesmall"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="center"
      android:indeterminate="true"/>
  </linearlayout>
  <linearlayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <button
      android:id="@+id/bt3"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_weight="1"
      android:text="测试启动3"/>
    <progressbar
      android:id="@+id/pb3"
      style="?android:attr/progressbarstylesmall"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="center"
      android:indeterminate="true"/>
  </linearlayout>
</linearlayout>

以上所述是小编给大家介绍的android 中不用线程如何实现倒计时,希望对大家有所帮助

上一篇: android SQLite数据库总结

下一篇: