当前位置: 首页>移动开发>正文

android studio 页面定时器 android 定时器使用的比较

android实现定时任务一般会使用以上(Handler Timer Thread AlarmManager CountDownTimer)五种方式。当然还有很多组合使用(比如Handler+Thread 比如Handler类自带的postDelyed 比如Handler+Timer+TimerTask)的方式就不一一说明了,知道了每个小部分的使用结合起来使用当然就不是问题啦。

本文以简单的实现1s让数字加1的一个小实例。(考虑只点击一次的情况。连续点击 需要控制没有结束的时候 不许点击的逻辑)

一:使用Handler:

private Handler mHandler = new Handler(){
         @Override
         public void handleMessage(Message msg) {
             if(msg.what == 1){
                 Log.e(TAG,"mHandler"+Thread.currentThread().getName());
                 tvNum.setText((Integer.parseInt(tvNum.getText().toString())+1)+"");
                 mHandler.sendEmptyMessageDelayed(1,1000);
             }
         }
     };

在点击事件的时候 调用 mHandler.sendEmptyMessageDelayed(1,1000);可以使用   mHandler.removeMessages(1);取消handler。

二:使用Timer。使用Timer的时候要用到TimerTask。也是很简单的使用:

private void timer() {
         timer = new Timer();
         timer.schedule(new TimerTask() {
             @Override
             public void run() {
                 Log.e(TAG, "Timer:"+Thread.currentThread().getName());
                 runOnUiThread(new Runnable() {
                     @Override
                     public void run() {
                         tvNum.setText((Integer.parseInt(tvNum.getText().toString())+1)+"");
                     }
                 });
             }
         }, 1000, 1000);
     }

点击的时候就直接调用这个方法就好了。前面一个1000表示多久之后开始执行。后面的1000表示多久执行一次。其他的同名重载函数。看方法名就知道每个函数的作用了。

三:使用Thread,使用这个个人感觉和Timer差不多。都是开一个线程+延时操作。所以更新UI的时候必须在主线程。

private MyThread thread;
     private class MyThread extends Thread {
         public boolean stop;
         public void run() {
             while (!stop) {
                 // 通过睡眠线程来设置定时时间
                 try {
                     Thread.sleep(1000);
                     Log.e(TAG, "Thread:"+Thread.currentThread().getName());
                     runOnUiThread(new Runnable() {
                         @Override
                         public void run() {
                             tvNum.setText((Integer.parseInt(tvNum.getText().toString())+1)+"");
                         }
                     });
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
             }
         };
     };
     private void startThread() { //开始线程
         if (thread == null) {
             thread = new MyThread();
             thread.start();
         }
     }
     private void stopThread() { //结束线程
         if (thread != null) {
             thread.stop = true;
             thread = null;
         }
     }

点击时间调用startThread()就好了。

四:使用alarmService。其实通过AlarmManager来实现的。AlarmManager在安卓中最常见使用的地方就是闹钟。看这个的名字就知道是启动一个系统级服务来完成的。贴代码:

private String ACTION_NAME = "alarmService";
     private void alarmServiceStart(){
         //注册广播
         registerBoradcastReceiver();
         //启动AlarmManager
         Intent intent =new Intent(ACTION_NAME);
         PendingIntent sender=PendingIntent
                 .getBroadcast(this, 0, intent, 0);
         long firstime= SystemClock.elapsedRealtime();
         AlarmManager am=(AlarmManager)getSystemService(ALARM_SERVICE);
         //5秒一个周期,不停的发送广播
         am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP
                 , firstime,1000, sender);
     }
     //注册广播
     public void registerBoradcastReceiver(){
         IntentFilter myIntentFilter = new IntentFilter();
         myIntentFilter.addAction(ACTION_NAME);
         registerReceiver(mBroadcastReceiver, myIntentFilter);
     }
     private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver(){
         @Override
         public void onReceive(Context context, Intent intent) {
             String action = intent.getAction();
             if(action.equals(ACTION_NAME)){
                 tvNum.setText((Integer.parseInt(tvNum.getText().toString())+1)+"");
             }
         }
     };五:CountDownTimer:这个其实是android封装好的一个倒计时类。用法特别方便:如下
/**
     * 使用CountDownTimer   其实是android封装好的 倒计时类
      * 说明这里的10*1000表示总时间 也就是10s 1000表示多久执行一次
      */
     private CountDownTimer countDownTimer = new CountDownTimer(10*1000, 1000) {
         @Override
         public void onTick(long millisUntilFinished) {
             tvNum.setText((Integer.parseInt(tvNum.getText().toString())+1)+"");
         }
 @Override
         public void onFinish() {
             tvNum.setText("执行结束");
         }
     };

总结:用法其实都是很简单的。但是就是因为有很多种方法实现不知道使用哪一种。个人建议:

1,使用倒计时(限时特卖时间倒计时,获取验证码倒计时)可以使用第五种方法实现。(不考虑自定义组件)

2,图片的轮播,banner之类的可以使用Handler和Timer(Thread差不多)。实现定时滑动。(不考虑自定义组件)

3.使用一些对特定时间执行要求比较严格的时候使用alarmService。这里说明一下:Android系统锁的机制,即系统在检测到一段时间没有活跃以后,会关闭一些不必要的服务来减少资源和电量消耗。使用Timer和Service来实现的话很可能出现的情况就是屏幕熄灭后一段时间,服务就被停止了,当然轮询也就被停止了。当前轮播停止对我们影响不大。但是某种特定的情况停止了可以造成很大的损失。比如闹钟:停止了你还能起来吗?

这里还有一点就是第四种am的setRepeating方法。设置类型为AlarmManager.ELAPSED_REALTIME时候 当应用休眠的时候 也不会执行定时任务。设置类型为AlarmManager.ELAPSED_REALTIME_WAKEUP的时候 就会一直执行。

以上观点都是我的个人看法。如果有不对的地方 忘大神指教。有没有注意到的地方也忘大神指教


https://www.xamrdz.com/mobile/4qj1963144.html

相关文章: