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的时候 就会一直执行。

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

附上项目的github地址 https://github.com/tozzais/AndroidTimingTest


更多相关文章

  1. Android 中如何关闭线程
  2. Android怎样修改系统时间?
  3. Android中线程的使用方法
  4. Android UI主线程和子线程
  5. Android文档——进程优先级与线程
  6. Android之 UI主线程ZT
  7. Android中的多线程

随机推荐

  1. Android本地数据搜索实现
  2. 关于Android Studio关闭模拟器死机解决方
  3. 监听电话状态
  4. android WebView 应用内点击超链接不调用
  5. 《Android.Programming.Pushing.the.Limi
  6. Android 自定义设置文本字体间间距
  7. Android下的junit 单元测试
  8. Android 上下文菜单
  9. Android AsyncTask Download
  10. MVC架构设计与经典三层模型