• 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);
  • 相关阅读:
    开机自启动程序 注册表
    windows系统调用 线程创建
    windows系统调用 进程终止
    windows系统调用 进程快照
    线性表基本维护[ACM]
    获取操作系统版本号
    获得进程句柄
    <五>JDBC_利用反射及JDBC元数据编写通用的查询方法
    <四>JDBC_PreparedStatement的使用
    <三>JDBC_面向对象思想的体现
  • 原文地址:https://www.cnblogs.com/zhangshuli-1989/p/zhangshuli_postDelayed_15928175.html
Copyright © 2020-2023  润新知