当前位置: 移动技术网 > IT编程>移动开发>Android > Android 中不用线程如何实现倒计时

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

高晓松国籍,理想论坛,平鲁吧

需求:

有多个组件可以开启倒计时,正常情况下默认倒计时时间终了后更新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 中不用线程如何实现倒计时,希望对大家有所帮助

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网