• android studio定时器代码简析


    摘要:本文结合源代码详细分析一下基于message的定时器,在编写物联网应用APP的时候,获取传感器数据会用到这个功能。

     

    想实现定时获取数据,然后在安卓APP上显示出来。

    定时获取连接阿里云硬件属性的APP

     

    安卓编程中,定时器的实现方式有很多种,本文介绍一种比较简单的用法。结合源代码讲解。

    首先需要import一些库,其中Timer用于在后台线程中为将来执行任务调度任务的工具类。

    import androidx.appcompat.app.AppCompatActivity;

    import java.util.Timer;
    import java.util.TimerTask;

    然后需要创建一个Timer对象,接下来就可以用timer来调用它。

    Timer timer = new Timer();

    然后创建一个TimerTask对象,TimerTask是实现Runnable的一个静态类,我们创建任务时只需继承它,然后重写run方法。我们需要在run里面try一下我们需要做的工作。当然最重要的是发送message。这个message发出后,用mHandler来响应全局的一些操作。因为在task里面,有些操作是无法进行的。例如我们想在界面上的textview等控件显示数据,或者用其他控件显示曲线。

     TimerTask task=new TimerTask() {
                @Override
                public void run() {
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            try {   
                                 textJson=value;  
                                Message message = new Message();
                                mHandler.sendMessage(message);
                            }catch (Exception e){
                                e.printStackTrace();
                            }
                        }
                    }).start();
                }
            };
            //延迟时间,间隔时间*
            timer.schedule(task,0,3000);
        }

    具体怎么样响应呢?需要在主线程中更新UI。我们用的就是handler,它是android中为了处理异步线程更新UI的问题而出现的一个工具,在android异步线程是不能够更新UI的,只能在主线程中更新UI。我们所要做的就是向handler中传递消息(就是刚才在定时器中发送的消息message),然后handler响应所传递来的消息。据说handler会有一个消息队列,是根据你出入的消息顺序排列的,handler会依次响应消息队列里面的消息。本文的例子只用到了一个message。

     //在handler中更新UI
            final Handler mHandler =new Handler(){
                public void handleMessage(Message msg){
                    mTextView.setText(textJson);
                }
            };

    最后将要给完整的例子列举如下,供大家参考。

    1. package com.example.XXXXX;
    2. import androidx.appcompat.app.AppCompatActivity;
    3. import java.util.Timer;
    4. import java.util.TimerTask;
    5. public class MainActivity extends AppCompatActivity {
    6. Timer timer = new Timer();//花生,准备使用定时器
    7. private static final String TAG = "MainActivity";
    8. @Override
    9. protected void onCreate(Bundle savedInstanceState) {
    10. super.onCreate(savedInstanceState);
    11. setContentView(R.layout.activity_main);
    12. //在handler中更新UI
    13. final Handler mHandler =new Handler(){
    14. public void handleMessage(Message msg){
    15. mTextView.setText(textJson);
    16. }
    17. };
    18. TimerTask task=new TimerTask() {
    19. @Override
    20. public void run() {
    21. new Thread(new Runnable() {
    22. @Override
    23. public void run() {
    24. try {
    25. textJson=value;
    26. Message message = new Message();
    27. mHandler.sendMessage(message);
    28. }catch (Exception e){
    29. e.printStackTrace();
    30. }
    31. }
    32. }).start();
    33. }
    34. };
    35. //延迟时间,间隔时间*
    36. timer.schedule(task,0,3000);
    37. }
    38. }

    总结:定时器是一个非常重要的功能,对于物联网平台操作,大家一定要掌握。

  • 相关阅读:
    STM32 Bootloader开发记录 3 固件签名校验
    贪吃蛇游戏
    无限连接:前端跨页面通信的实现与应用
    洛谷P5731 【深基5.习6】蛇形方阵java版题解
    弘辽科技:拼多多选品的方式有哪些?有什么选品技巧?
    OpenJudge NOI 2.1 7213:垃圾炸弹
    数据结构--图
    使用labelme自制coco格式数据集
    RabbitMQ 入门系列:9、扩展内容:死信队列:真不适合当延时队列。
    单调栈和单调队列可以很简单
  • 原文地址:https://blog.csdn.net/youngwah292/article/details/125955510