欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Handler

程序员文章站 2022-05-14 17:57:55
...

今天我学习了Handler,下面我们通过五大模块来了解下handler相关内容(有错误帮忙点出来,谢谢大家。我的理解还很片面和浅薄!)

一、什么是handler?

handler是Android给我们提供用来更新UI的一套机制,也是一套消息处理机制,我们可以发消息,也可以通过它处理消息。
二.什么是Looper和messageQueue?

大家都知道handler的作用有两个,发送消息和处理消息。而handler发送的消息必须被送到指定MessageQueue(消息队列)中,也就是说,如果想让handler正常工作,就必须有一个MessageQueue(消息队列),不过MessageQueue(消息队列)是由Looper来关系。所以也可以说想让handler正常工作,必须在当前线程中有一个Looper对象。请认真读
总结
Looper:每个线程只有一个Looper,相当于是利用消息队列的方式 ,他负责管理MessageQueue,会不断的从MessageQueue取出消息,分发给对象的handler。

MessageQueue为消息队列,用来储存各个子线程的消息。

三.什么是Message?
Message(消息)类是通信内容的载体。线程间的通信包含哪些数据等等信息,都是由Message来保存。通常对Message对象不是直接new出来的,只要调用handler中的obtainMessage方法来直接获得Message对象。
属性字段:arg1、arg2、what、obj、其中arg1和arg2是用来存放整型数据的;what是用来保存消息标示的;obj是Object类型的任意对象;
*
四. 如何使用handler?

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

    五.倒计时案例举例:
    Handler
    之前讲的已经都说了,这我就直接贴代码了:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"

    tools:context="com.example.administrator.myapp.Main2Activity">

    <EditText
        android:id="@+id/shuru"
        android:layout_width="match_parent"
        android:layout_height="40dp" />

    <TextView
        android:id="@+id/tv_time"
        android:layout_width="match_parent"
        android:layout_height="50dp"

        android:layout_below="@+id/shuru"
        android:textSize="30sp"

        />

    <Button
        android:id="@+id/btn_begin"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_centerVertical="true"
        android:text="start" />
</RelativeLayout>

Activity中代码:

package com.example.administrator.myapp;

import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class Main2Activity extends AppCompatActivity {
private EditText shuru;
    private Button btn_begin;
    private TextView tv_time;
    int time;
private Handler handler=new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        tv_time.setText(msg.what+"");
    }
};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        btn_begin = (Button) findViewById(R.id.btn_begin);
        tv_time = (TextView) findViewById(R.id.tv_time);
        shuru=findViewById(R.id.shuru);

        btn_begin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                time=Integer.parseInt(shuru.getText().toString());
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        for(int i=time;i>0;i--){
                            handler.sendEmptyMessage(i);
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }).start();
            }
        });
    }}

相关标签: Handler