AS之Handler消息处理

Looper

  • Looper对象用来为一个线程开启一个消息循环,从而操作MassageQueue。
  • 默认情况下,Android新创建的线程没有开启消息循环,但主线程除外。系统自动为主线程创建Looper,开启消息循环。
  • 如果想在非线程中创建Handler对象,首先使用Looper类的prepare()方法初始化一个Looper对象,然后创建Handler对象,再试用Looper类的loop()方法启动Looper,从消息队列中获取和处理消息
  • 在使用Handler处理Message时,都需要一个Looper通道完成,在一个Activity类中,会自动帮助用户启动Looper对象,而在用户自定义的类中,需要手动调用Looper类中的方法,才能启动
  • Looper常用方法
方法 作用
public static Looper getMainLooper() 取得主线程
public static Looper myLooper() 返回主线程
public static void prepare() 初始化Looper对象
publics tatic void prepareMainLooper() 初始化主线程Looper对象
public static quit() 用于结束Looper循环
public static void loop 启动消息队列,会从消息队列中获取和处理信息

Handler

  • 在主线程中获取,处理消息:将Message或Runnable应用post()或sendMassage()方法发送到MessageQueue中,在发送时可以指定延长时间,发送时间及要携带的Bundle数据,当MessageQueue循环到该Message时,调用相应的Handler对象和handlerMessage()方法对其进行处理。
  • 在启动的子线程中发送消息:在子线程中与主线程进行通信,也就是在工作线程中与UI线程进项通信
  • Handler常用方法:
序号 方法 作用
01 public Handler() 创建一个新的Handler类实例
02 public Handler(Looper looper) 使用指定的队列创建一个新的Handler
03 public final Message obtainMessage() 获得一个空的Messgae对象
04 public final Message abtainMessage(int what) 获得一个Message对象
05 public final Message obtainMessage(int what,Object obj) 获得一个Message对象
06 public final Message obtainMessage(int what,int arg1,int argue2) 获得一个message对象
07 public final Message obtainMessage(int what,int arg1,int arg2,Object obj) 获得一个Message对象
08 public void handleMessage(Message msg) 处理消息的方法,子类要覆写此方法
09 public final boolean hasMessage(int what) 判断是否有指定的消息
10 public final boolean hasMessage(int what,Object obj) 判断是否有指定消息
11 public final void removeMessage(int what) 删除指定的消息
12 public final void removeMessage(int what,Object obj) 删除指定的消息
13 public final boolean sendEmptyMessage(int what) 发送一个空消息
14 public final boolean sentEmptyMessageAtTime(int what,long uptimeMillis) 在指定的日期时间发送消息
15 public final boolean sentEmptyMessageDelayed(int what,long delayMillis) 等待指定的时间之后发送消息
16 public final boolean sendMessage(Message msg) 发送消息

Message

  • 主要功能是进行消息的封装,同时可以指定消息的操作形式,也就是说,存放在MessageQueue中的Message有多个形式,每个Message对象可以通过Message.ontain()方法或Handler.obtainMessage()方法获得
方法 类型 作用
public int what 变量 定义此Message属于何种操作
public Object obj 变量 定义此Message传递的信息数据
public int argue1 变量 传递一些整形数据时使用
public intagree2 变量 传递一些整形数据时使用
public Handler getTarget() 方法 取得操作此消息的Handler对象

一,线程

  1. 内容:获取消息对象,为消息对象设置标识及携带的数据,向消息处理对象发送消息,设置线程休眠(耗时操作)
  2. 创建线程:
    1) 通过Thread类的构造方法创建线程对象,并重写run()方法,
    2)通过实现Runnable接口,实现其中的run()方法
  3. 开启线程:通过Thread类提供的start()方法
  4. 线程休眠:通过sleep(long time)的参数time指定休眠时间
  5. 中断线程:Thread类的interruput()方法,可以向指定的线程发送一个中断请求,并将该线程标记为中断状态。
  • 实例
package com.example.a4_6;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
    private ImageView img;         //定义图片组件
    private boolean flag=false;     //定义循环
    private Handler handler;       //定义消息处理
    private int[] path=new int[] {R.mipmap.p1,R.mipmap.p2,
            R.mipmap.p3,R.mipmap.bed,
            R.mipmap.cat
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //找到组件
        img=(ImageView) findViewById(R.id.img);
        Button start=(Button)findViewById(R.id.start);
        final Button stop=(Button) findViewById(R.id.stop);
        start.setOnClickListener(new View.OnClickListener() {  //委组建设置监听器
            @Override
            public void onClick(View v) {
                flag=true;                              //循环
                new Thread(new Runnable() {         //使用Runnable接口创建子线程
                    @Override
                    public void run() {         //重写run方法
                        int index=0;
                        while (!Thread.currentThread().isInterrupted()&&flag){ //当前线程没有中断并且循环
                            index=new Random().nextInt(path.length);//获取一个随机数
                            Message m=handler.obtainMessage();//创建一个空消息
                            m.arg1=index;                      //为消息设置数据携带
                            m.what=0x101;                    //设置消息类型
                            handler.sendMessage(m);         //发送消息
                            try {                           //异常捕获休眠
                                Thread.sleep(2000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }).start();//                       开启线程
              stop.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      flag=false;
                  }
              });
                handler=new Handler(){                  //线程处理
                   public void handleMessage(Message msg){
                       super.handleMessage(msg);       
                       if (msg.what==0x101){             //获取线程
                           img.setImageResource(path[msg.arg1]);  //设置图片显示
                        }
                   }
              };
            }
        });
    }
}

发布了18 篇原创文章 · 获赞 0 · 访问量 238

猜你喜欢

转载自blog.csdn.net/qq_44230959/article/details/105578635