zoukankan      html  css  js  c++  java
  • Handle-postDelayed 延迟操作

    今天在工作的时候,遇到了一个方法,是关于Handle来实现延时操作的,自己写了一个小demo,学习总结如下

    xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical" >
    
        <RelativeLayout
            android:id="@+id/abc"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:padding="30dp" >
    
            <RelativeLayout
                android:id="@+id/ll"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="20dp" >
    
                <TextView
                    android:id="@+id/tv_time"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:background="@drawable/select"
                    android:text="time"
                    android:textColor="#ffffff"
                    android:textSize="30dp" />
    
                <TextView
                    android:id="@+id/tv_click"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentRight="true"
                    android:background="@drawable/select"
                    android:text="click"
                    android:textColor="#ffffff"
                    android:textSize="30dp" />
            </RelativeLayout>
    
            <TextView
                android:id="@+id/tv_run"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/ll"
                android:layout_centerHorizontal="true"
                android:background="@drawable/select"
                android:padding="20dp"
                android:text="wait...."
                android:textColor="#ffffff"
                android:textSize="30dp" />
    
            <Button
                android:id="@+id/bt1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/tv_run"
                android:src="@drawable/select"
                android:text="start"
                android:textColor="#ff0000" />
    
            <Button
                android:id="@+id/bt2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/tv_run"
                android:layout_centerHorizontal="true"
                android:src="@drawable/select"
                android:text="stop"
                android:textColor="#ff0000" />
    
            <Button
                android:id="@+id/bt3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_below="@+id/tv_run"
                android:src="@drawable/select"
                android:text="clear"
                android:textColor="#ff0000" />
        </RelativeLayout>
    
    </LinearLayout>

    java如下

    package com.example.alert;
    
    import android.R.integer;
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    
    public class HeadSetActivity extends Activity {
        private TextView tv_time;
        private TextView tv_click;
        private TextView tv_run;
        private Button button1;
        private Button button2;
        private Button button3;
        private int time = 0;
        private boolean time_begin = true;
        private int click = 0;
        //创建消息队列
         private Handler uiHandle = new Handler(){  
                public void handleMessage(Message msg) {  
                    switch(msg.what){  
                    //实现计时器功能
                    case 1: 
                        time++;
                        tv_time.setText("time:"+time);
                        uiHandle.sendEmptyMessageDelayed(1, 1000);  
                        break;  
                    default: break;  
                    }  
                }  
            };
            //开启一个线程
            private Runnable runnable = new Runnable() {
                
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    tv_run.setText("runnable is start|time="+time);
                }
            };
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tv_time = (TextView)findViewById(R.id.tv_time);
            tv_click = (TextView)findViewById(R.id.tv_click);
            tv_run = (TextView)findViewById(R.id.tv_run);
            button1 = (Button) findViewById(R.id.bt1);
            button2 = (Button) findViewById(R.id.bt2);
            button3 = (Button) findViewById(R.id.bt3);
            //启动计时器以及runnable延时操作
            button1.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    //启动activity1
                    if (time_begin) {
                        uiHandle.sendEmptyMessageDelayed(1, 1000);
                        tv_run.setText("runnable wait begin|time="+time);
                        time_begin = false;
                    }
                    click++;
                    tv_click.setText("click:"+click);
                    
                    uiHandle.postDelayed(runnable,4000);
                }
                        
            
            });
    //移除runnable延时操作        
    button2.setOnClickListener(new OnClickListener() {
        
        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            uiHandle.removeCallbacks(runnable);
            tv_run.setText("runnable is clear|time ="+time);
            
        }
    });
    //清除消息队列的所有操作
    button3.setOnClickListener(new OnClickListener() {
        
        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            uiHandle.removeMessages(1);
            tv_click.setText("click");
            tv_run.setText("wait...");
            tv_time.setText("time");
            uiHandle.removeCallbacks(runnable);
            time_begin = true;
            time = 0;
            click = 0;
        }
    });
        }
    
    }

    我们看下如下的演示结果

    从上面的演示结果我们可以得出关于postDelayed 的知识点总结

    1.这个方法是用来延时执行一个动作的

    2.多次执行这个动作,并不会移除之前仍然处于延时等待状态的动作

    3.如果想要结束处于等待执行中的动作,我们可以主动调用

    uiHandle.removeCallbacks(runnable);
  • 相关阅读:
    通过队列实现进程间的通信(使用阻塞方式调用func函数)
    Scrapy 项目:QuotesBot
    数据分析_找数据参考网站
    Matplotlib 图表绘制工具学习笔记
    Python算法_斐波那契数列(10)
    Python算法_排序数组(09)
    Python数据结构与算法_反转字符串(08)
    Python算法_爬楼梯(08)
    Python数据结构与算法_搜索插入位置(07)
    Python数据结构与算法_删除排序数组中的重复项(06)
  • 原文地址:https://www.cnblogs.com/zhangshuli-1989/p/zhangshuli_postDelayed_15928175.html
Copyright © 2011-2022 走看看