Handle

1. 为什么要使用Handle

  1. Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用。比如可以用handler发送一个message,然后在handler的线程中来接收、处理该消息,以避免直接在UI主线程中处理事务导致影响UI主线程的其他处理工作,Android提供了Handler作为主线程和子线程的纽带;也可以将handler对象传给其他进程,以便在其他进程中通过handler给你发送事件;还可以通过handler的延时发送message,可以延时处理一些事务的处理。

2.什么是Handle

1.主要接受子线程发送的数据,并用此数据配合主线程更新UI。
2.Android首先会开启一个主线程(也就是UI线程),主线程为管理界面中的UI控件,进行时间分发,比如说,你要是点击一个Button,Android会分发事件到Button上,来响应你的操作。如果这个时候需要一个耗时的操作,比如:联网读取数据。或者读取一个比较大的文件时,你不能把这些操作放在主线程中,如果放在主线程中,界面就会出现卡死的现象。这个时候我们就需要把这些耗时的操作放在一个子线程中。而且更新UI只能在主线程中更新,子线程中操作会进行报错。这个时候Handle就出现了。
3.因为Handle运行在主线程中,它与子线程可以通过Message对象来传递数据。这个时候Handle就承担着子线程传过来的Message对象,把这些消息放在主线程队列中,配合主线程更新UI

3.什么是Looper

1.Looper:(相当于隧道) 一个线程可以产生一个Looper 对象,由它来管理此线程里的Message Queue( 车队,消息隧道) 。
2.在Android中创建出的普通线程默认是没有消息循环的,run方法执行完毕,线程也就结束了。
3.如果让先秀衡不停的循环的工作时可以使用Looper,将普通线程变成循环工作的线程。
在你的Android 程序里,新诞生一个线程,或执行 (Thread) 时,并不会自动建立其Message Loop 。
Android 里并没有Global 的Message Queue 数据结构,例如,不同APK 里的对象不能透过Massage Queue来交换讯息(Message) 。
例如:线程A 的Handler 对象可以传递消息给别的线程,让别的线程B 或C 等能送消息来给线程A( 存于A的Message Queue 里) 。

4.什么是Message Queue

1.当创建Looper时,将会自动创建出Message Queue。
2.一个线程中只会 存在一个Looper和一个MessageQueue。
3.当MessageQueue中有消息时,Looper将从MessageQueue中取出消息。

5.Handle怎么使用

1.使用Handle首先要创建一个实例 写一个HandleMessage的方法 用于接收子线程的消息

 private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

2.接下来我们需要子线程发出消息

                                       handler.sendEmptyMessage(-1);

3.接收消息用HandleMessage方法

  public void handleMessage(Message msg) {
            super.handleMessage(msg);
  downloadTV.setText(msg.what+"");

5.案例解析——倒计时

1.在Handle的基础上写一个While循环 或者for循环

 while (count>0){
                            count--;
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();

2.把当前的数据传值给Handle

  handler.sendEmptyMessage(count);

3.用msg接收

  downloadTV.setText(msg.what+"");

4.完整Java代码如下

package com.example.administrator.mysky;

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

public class Xiancheng extends AppCompatActivity implements View.OnClickListener{
    private TextView downloadTV;
    private Button downloadBtn;
    private int count =10;
    private Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

         if(msg.obj!=null){
             String result =(String) msg.obj;
             downloadTV.setText(result);
         }else {
             downloadTV.setText(msg.what+"");
         }
        }

    };

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

    private void bindID() {
        downloadTV=findViewById(R.id.download_tv);
        downloadBtn=findViewById(R.id.download_btn);
        downloadBtn.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.download_btn:


                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        while (count>0){
                            handler.sendEmptyMessage(count);
                            count--;
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                     Message msg =handler.obtainMessage(1);
                        msg.obj ="倒计时完成";
                        handler.sendMessage(msg);


                    }
                }).start();


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值