Handler小结

1.为什么要用Handler

在Android中里有一句主线程中不能进行耗时操作,所以进行耗时操作一般开启子线程,在Android中子线程不能更新UI线程(主线程),所以需要一个子线程与主线程通讯的工具,即Handler类。

2.什么是Handler

Handler即线程通讯的工具,可以进行更新ui和处理消息。

3.什么是Looper

1、Looper可以让一个线程具有循环工作的特性,也就说可以把线程编程Looper线程。

2、每个线程只能也最多有一个Looper对象,这个Looper对象是一个Thredlocal,可以保证当前线程操作的Looper对象一定是当前线程自己的。

3、Looper内部有一个MQ,调用loop()方法后线程开始不断的从MQ中去消息交给后面的Handler处理。

4.什么是MessageQueue

消息队列就是一个数据的容器,并且可以异步处理数据,提高数据的并发性。比如审核文章:在同一时间,可以接受大量的文章(数据)。但是审核的人是一份一份看然后通过审核。

5.Handler怎么用

用一个简单的例子来展示,代码如下:

package com.example.demo5;

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.TextView;

public class DemoActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView demo_tv;
    private Button demo_btn;
    private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            demo_tv.setText("测试完成");
            //修改ui
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo);
        demo_btn=findViewById(R.id.demo_btn);
        demo_tv=findViewById(R.id.demo_tv);
        demo_btn.setOnClickListener(this);
    }
//点击按钮开始线程
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.demo_btn:
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        handler.sendEmptyMessage(1);
                        //传递一个int值,执行handleMessage方法
                    }
                }).start();
                break;
                default:
                    break;
        }

    }
}
<?xml version="1.0" encoding="utf-8"?>
<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=".DownloadActivity">
    <TextView
        android:id="@+id/demo_tv"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:text="测试中"
        tools:ignore="InvalidId" />
    <Button
        android:id="@+id/demo_btn"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:text="开始测试"/>
</LinearLayout>

6.案列解析———倒计时Demo

先附上代码

package com.example.demo5;

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 DemoActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView demo_tv;
    private Button demo_btn;
    private EditText demo_et;
    private int i=0;
    private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Bundle bundle= msg.getData();
            if (msg.what==0){
            //做一个终止标记
                demo_tv.setText(""+msg.obj);
            }else {
            //输出i
                demo_tv.setText(""+msg.what);
            }
        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo);
        demo_btn=findViewById(R.id.demo_btn);
        demo_tv=findViewById(R.id.demo_tv);
        demo_et=findViewById(R.id.demo_et);
        demo_btn.setOnClickListener(this);


    }

    @Override
    public void onClick(View v) {
    //获取输入的值
        if(demo_et!=null){
            String str=demo_et.getText().toString();
            if(str!=null&&str.length()>0){
                i=Integer.parseInt(str);
            }

        }
        switch (v.getId()){
            case R.id.demo_btn:
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                    //开启循环,每过一秒减一,并且提交i
                        for(;i>=0;i--){

                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            handler.sendEmptyMessage(i);


                        }
                        Message msg =handler.obtainMessage();
                        msg.obj="倒计时完成";
                        handler.sendMessage(msg);
                        //提交消息
                    }
                }).start();
        }
    }
}
<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=".DownloadActivity">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:orientation="horizontal">
        <TextView
            android:layout_width="50dp"
            android:layout_height="30dp"
            android:text="倒计时"/>
        <EditText
            android:id="@+id/demo_et"
            android:layout_width="60dp"
            android:layout_height="40dp"
            android:gravity="bottom"
            android:inputType="number"
            />
        <TextView
            android:layout_width="50dp"
            android:layout_height="30dp"
            android:text="秒"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:orientation="vertical"
        android:layout_weight="1">
        <TextView
            android:id="@+id/demo_tv"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:gravity="center"
            android:textSize="40sp"/>
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1">
            <Button
                android:id="@+id/demo_btn"
                android:layout_width="120dp"
                android:layout_height="40dp"
                android:layout_centerHorizontal="true"
                android:text="倒计时开始"/>
        </RelativeLayout>

    </LinearLayout>

</LinearLayout>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值