安卓自定义计时器控件的不同方法

    科技2024-03-31  99

    安卓自定义计时器控件

    方法一 Timer与TimerTask(Java实现) schedule(TimerTask task, long delay) // 延迟delay毫秒后,执行一次task。 schedule(TimerTask task, long delay, long period) // 延迟delay毫秒后,执行第一次task,然后每隔period毫秒执行一次task。

    mTimer.schedule(new TimerTask() { @Override public void run() { Log.d("WelcomeActivity", "当前线程:"+ Thread.currentThread().getName()); toMain(); } },3*1000);

    方法二 TimerTask与Handler(不用Timer的改进型) TimerTask中执行 发送信息的语句, 定义在MainActivity 中的handle 在接收到消息后执行handleMessage()

    private int recLen = 11; private TextView txtView; private void init() { Timer timer = new Timer(); timer.schedule(task, 1000, 1000); // timeTask } final Handler handler = new Handler(){ @Override public void handleMessage(Message msg){ switch (msg.what) { case 1: txtView.setText(""+recLen); if(recLen < 0){ timer.cancel(); txtView.setVisibility(View.GONE); } } } }; TimerTask task = new TimerTask() { @Override public void run() { recLen--; Message message = new Message(); message.what = 1; handler.sendMessage(message); } }; }

    方法三 Handler与Message(不用TimerTask) 使用sendMessageDelayed()方法。 该方法还是在主线程中进行。

    private void init() { Message message = handler.obtainMessage(1); // Message handler.sendMessageDelayed(message, 1000); } final Handler handler = new Handler(){ public void handleMessage(Message msg){ // handle message switch (msg.what) { case 1: recLen--; txtView.setText("" + recLen); if(recLen > 0){ Message message = handler.obtainMessage(1); handler.sendMessageDelayed(message, 1000); // send message }else{ txtView.setVisibility(View.GONE); } } super.handleMessage(msg); } };

    方法四 Handler与Thread(不占用UI线程) 利用sleep()方法

    public class timerTask extends Activity{ private int recLen = 0; private TextView txtView; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.timertask); txtView = (TextView)findViewById(R.id.txttime); new Thread(new MyThread()).start(); // start thread } final Handler handler = new Handler(){ // handle public void handleMessage(Message msg){ switch (msg.what) { case 1: recLen++; txtView.setText("" + recLen); } super.handleMessage(msg); } }; public class MyThread implements Runnable{ // thread @Override public void run(){ while(true){ try{ Thread.sleep(1000); // sleep 1000ms Message message = new Message(); message.what = 1; handler.sendMessage(message); }catch (Exception e) { }

    方法五 Handler与Runnable(最简单型), Handler.postDelayed()方法为一种实现多线程方法,通过创建一个Handler对象和一个Runnable对象;使用postDelayed()方法使之从新调用Runnable对象 关闭此定时器:handler.removeCallbacks(runnable);

    public class timerTask extends Activity{ private int recLen = 0; private TextView txtView; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.timertask); txtView = (TextView)findViewById(R.id.txttime); handler.postDelayed(runnable, 1000); } Handler handler = new Handler(); Runnable runnable = new Runnable() { @Override public void run() { recLen++; txtView.setText("" + recLen); handler.postDelayed(this, 1000); } }; }

    计时与倒计时 方法1,方法2和方法3,都是倒计时 方法4,方法5,都是计时 计时和倒计时,都可使用上述方法实现(代码稍加改动) UI线程比较 方法1,方法2和方法3,都是在UI线程实现的计时; 方法4和方法5,是另开Runnable线程实现计时 实现方式比较 方法1,采用的是Java实现,即Timer和TimerTask方式; 其它四种方法,都采用了Handler消息处理 推荐使用 如果对UI线程交互要求不很高,可以选择方法2和方法3 如果考虑到UI线程阻塞,严重影响到用户体验,推荐使用方法4,另起线程单独用于计时和其它的逻辑处理 方法5,综合了前几种方法的优点,是最简的 方法六 使用.CountDownTimer类 CountDownTimer是一个抽象类,有两个抽象方法,它的API很简单

    public abstract void onTick(long millisUntilFinished); //这个是每次间隔指定时间的回调, //millisUntilFinished:剩余的时间,单位毫秒 public abstract void onFinish(); //这个是倒计时结束的回调

    注意需要调用.start(),来开启计时。 1.自动处理生命周期,不会发生内存泄漏 2.继承TextView,直接布局使用,样式设置按照TextView设置即可 3.设置点击事件开关,可以实现倒计时期间点击无效(短信验证码) 4.设置序列化操作开关,关闭页面、甚至杀掉app再进倒计时依然正确(短信验证码) 5.可倒计时,可正向计时 6.链式调用,方便快捷 案例

    mCountDownTextView.setNormalText("获取验证码") .setCountDownText("重新获取(", ")") .setCloseKeepCountDown(true)//关闭页面保持倒计时开关 .setCountDownClickable(true)//倒计时期间点击事件是否生效开关 .setShowFormatTime(true)//是否格式化时间 .setOnCountDownFinishListener(new CountDownTextView.OnCountDownFinishListener() { @Override public void onFinish() { Toast.makeText(MainActivity.this, "倒计时完毕", Toast.LENGTH_SHORT).show(); } }) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainActivity.this, "短信已发送", Toast.LENGTH_SHORT).show(); mCountDownTextView.startCountDown(60); } }); mCountDownTextView.start();
    Processed: 0.017, SQL: 8