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

Handler小结

程序员文章站 2022-07-14 17:04:30
...

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>