关于Handler的学习与使用

一、什么是Handler

1.定义:Handler是Android SDK中处理异步消息的核心类
Handler的作用是通过子线程通过与UI线程通信来更新UI界面


注意点:主线程不可做耗时工作 只有主线程可以更新UI


2.运行机制:

  • 创建一个Handler对象,系统就把Handler对象、UI线程和UI线程的消息队列捆绑起来
  • 在线程中处理完数据,可通过Handler对象将消息发出
  • 消息将会按先后顺序添加到消息队列中
  • UI线程中的Looper不断从消息队列中取出消息刷新UI
    3.组成
    Looper:可让线程不断的循环工作,将普通线程变成循环工作线程
    MessageQueue:存放消息的地方

注意点:一个线程中只能有一个Looper和MessageQueue


二、什么是Message

1.Message对象:消息对象,子线程将需要传递的UI线程的消息放入Message对象中,Message对象可以通过Handler对象 的obtainMessage方法获得
2.属性:

  • what:int类型的消息码,接受方用来识别是什么消息
  • arg1,arg2:int类型,如果传递的消息仅仅是整形数字,可将字赋给arg1或arg2
  • obj:Object类型:传递的消息是String或任意类型,可将数据赋给obj属性
  • sendToTarget方法:将消息发送给指定的Handler对象

三、使用Handler的步骤

1.在UI线程中创建Handler 匿名内部类对象
2.在匿名内部类中重写handlerMessage方法
3.在UI线程中启动子线程
4.在线程中获得Message对象
5.将需要传递的数据赋值到Message对象中
6.通过Handler对象的sendMessage方法发送到消息队列
7.在handleMessage方法中接受消息

四、倒计时案件举例(附代码和效果图)

下面我为大家带来一道我对Handler类型题目的展示
1.首先新建一个新的CountTimeActivity和activity_count_time.xml布局文件
在activity_count_time.xml布局文件中定义出EditText,TextView和Button三个控件

  <EditText
        android:id="@+id/daojishi_et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
    <TextView
        android:id="@+id/daojishi_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:padding="15dp"
        android:textSize="20sp"
        android:text="倒计时" />

    <Button
        android:id="@+id/daojishi_btn"
        android:layout_width="90dp"
        android:layout_height="50dp"
        android:text="开始计时" />

在这里我用的是线性布局,排列方式为垂直

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.myapplication9.CountTimeActivity">
</LinearLayout>

2.下面就是在CountTimeActivity中来对控件进行定义,绑定ID。对Button进行设置监听。因为倒计时数字是越来越小,所以要在子线程里放一个for循环,同时在全局里定义一个Handler机制来作为主线程接受子线程发来的消息,对UI界面进行更新

public class CountTimeActivity extends AppCompatActivity {
    private EditText daojishiET;
    private TextView daojishiTV;
    private Button daojishiBtn;
    private int time;
    Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            daojishiTV.setText(msg.what+"");
            }

    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_count_time);

        bindID();
        daojishiBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                time= Integer.parseInt(daojishiET.getText().toString());
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        for(int i=time;i>0;i--){
                           // Message message=handler.obtainMessage();
                         //   message.what= time;
                          //  handler.sendMessage(message);
                            handler.sendEmptyMessage(i);

                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        }
                    }
                }){}.start();
            }

        });
    }

    private void bindID() {
        daojishiET=findViewById(R.id.daojishi_et);
        daojishiTV=findViewById(R.id.daojishi_tv);
        daojishiBtn=findViewById(R.id.daojishi_btn);
    }

下面是几张成果效果图
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
上面就是我的分享,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值