• 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. }

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

  • 相关阅读:
    RHCSA_Linux 从命令行管理文件
    代码审查插件:Devart Review Assistant Crack
    C#项目版本号自定义位置自动向上增加小工具设计与实现
    SqlServer中去除字段空格及特殊空格/回车/换行等
    error:03000086:digital envelope routines::initialization error 问题解决
    【Java成王之路】EE初阶第十六篇:(网络原理) 6
    vue.draggable拖动插件的使用
    【共享单车数据专题】共享单车数据分析的技术要点
    多线程案例(2) - 阻塞队列
    剑指 Offer 48. 最长不含重复字符的子字符串
  • 原文地址:https://blog.csdn.net/youngwah292/article/details/125955510