Handler——小白实训笔记

Handler

**

1.什么是Handler

**

  • Handler是 Android SDK中处理异步的核心类;
  • Handler的作用是让通过子线程与主线程的通信来更新UI界面。

    运行机制:
    1)创建一个 Handler对象,系统就把 Handle对象、U线程和U饯线程的消息队列捆绑起来。
    2)当我们在线程中处理完数据后,可以通过 Handler对象将消息发出。
    3)消息将会按先后顺序添加到消息队列中。
    4)U线程中的Looper不断从消息队列中取出消息,刷新Ul;

2.什么是Looper和MessageQueue

- Looper
1)在 Android中创建出的普通线程默认是没有消息循环的,run方法执行完毕,线程也就结束了。
2)如果让线程不停的循环工作时,可以使用 Looper,将普通线程变成循环工作线程.
- MessageQueue
1)当创建 Looper时,将会自动创建出 Messagequeue。
2)一个线程中只会存在一个Lope和一个 Messagequeue。
3)当 Messagequeue中有消息时, Looper将从 Messagequeue中取出消息。

3.什么是Message

  • 消息对象,子线程将需要传递到U线程的信息放入 Message对象中, Message对象可以通过 Handler对象的obtainmessage方法获得。

    what属性:in类型的消息码,接收方用来识别是什么消息。
    arg1,arg2属性:int类型,如果传递的消息仅仅是整型数字,可以将数字赋给arg1或arg2。
    obj属性:Object类型,如果传递的消息是stng或任意类型时,可将数据赋给ob属性。

4.如何使用Handler

- 使用Handler的步骤
1)在U线程中创建Handler匿名内部类对象;
2)在匿名内部类中重写handlerMessage方法;
3)在U线程中启动子线程;
4)在线程中获得Message对象;
5)将需要传递的数据赋值到 Message对象中
6)通过 Handler对象的sendMessage方法发送消息到消息队列
7)在 handle Message法中接收消息。

**

5.倒计时案例举例(附代码和效果图)

**
xml代码:

<?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.texthandler.Main2Activity">
  <TextView
      android:id="@+id/text1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="设置时间"
      android:textSize="30sp"/>
    <EditText
        android:id="@+id/szsj"
        android:layout_width="60dp"
        android:layout_height="40dp"
        android:layout_toRightOf="@+id/text1"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="秒"
        android:layout_toRightOf="@+id/szsj"
        android:textSize="30sp"/>
    <TextView
        android:id="@+id/djs_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:text="倒计时"
        android:textSize="30dp"/>
    <Button
        android:id="@+id/djs_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="开始倒计时"
        android:layout_below="@+id/djs_text"
        android:layout_centerHorizontal="true"/>
</RelativeLayout>

java代码:

package com.example.texthandler;

import android.os.Handler;
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 TextView djstext;
    private Button djsbtn;
    private EditText djset;
    private int num;
    private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            djstext.setText("倒计时:" + msg.what + "");
            if (msg.what == 0) {
                djstext.setText("倒计时结束");
            }
        }
    };

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

        bindID();;
        djsbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

          num=Integer.parseInt(djset.getText().toString());//字符串整型

                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        for(int i=num;i>=0;i--){
                       //     Message msg=handler.obtainMessage();
                        //    msg.what=i;
                            handler.sendEmptyMessage(i);
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }

                    }
                }).start();

            }
        });

    }


    private void bindID() {
        djstext=findViewById(R.id.djs_text);
        djsbtn=findViewById(R.id.djs_btn);
        djset=findViewById(R.id.szsj);

    }
}

效果图展示:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值