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常用方法:
序号方法作用
01public Handler()创建一个新的Handler类实例
02public Handler(Looper looper)使用指定的队列创建一个新的Handler
03public final Message obtainMessage()获得一个空的Messgae对象
04public final Message abtainMessage(int what)获得一个Message对象
05public final Message obtainMessage(int what,Object obj)获得一个Message对象
06public final Message obtainMessage(int what,int arg1,int argue2)获得一个message对象
07public final Message obtainMessage(int what,int arg1,int arg2,Object obj)获得一个Message对象
08public void handleMessage(Message msg)处理消息的方法,子类要覆写此方法
09public final boolean hasMessage(int what)判断是否有指定的消息
10public final boolean hasMessage(int what,Object obj)判断是否有指定消息
11public final void removeMessage(int what)删除指定的消息
12public final void removeMessage(int what,Object obj)删除指定的消息
13public final boolean sendEmptyMessage(int what)发送一个空消息
14public final boolean sentEmptyMessageAtTime(int what,long uptimeMillis)在指定的日期时间发送消息
15public final boolean sentEmptyMessageDelayed(int what,long delayMillis)等待指定的时间之后发送消息
16public 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]);  //设置图片显示
                        }
                   }
              };
            }
        });
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 VBA 的 UserForm 控件来实现一个进度条,代码示例如下: 1. 首先创建一个 UserForm,命名为 ProgressBarForm,添加一个 Label 控件,命名为 Label1,设置 Caption 为 “Loading...”; 2. 在 Sub SetColor() 中添加以下代码: ``` Dim r As Range, arr() As String '声明变量 Dim total As Integer, count As Integer '声明变量 total = Range("A:QE").Count '获取单元格总数 count = 0 '初始化计数器 For Each r In Range("A:QE") arr = Split(r, ",") r.Interior.Color = RGB(CInt(arr(0)), CInt(arr(1)), CInt(arr(2))) count = count + 1 '每处理一个单元格计数器加一 ProgressBarForm.Label1.Caption = "Loading..." & count / total * 100 & "%" '更新进度条 DoEvents '刷新窗口,防止窗口假死 Next Unload ProgressBarForm '关闭进度条窗口 ``` 3. 在 Sub SetColor() 的开头添加以下代码,显示进度条窗口: ``` ProgressBarForm.Show vbModeless '显示进度条窗口 ``` 完整代码如下: ``` Sub SetColor() On Error GoTo ErrorHandler '添加错误处理程序 Dim r As Range, arr() As String '声明变量 Dim total As Integer, count As Integer '声明变量 total = Range("A:QE").Count '获取单元格总数 count = 0 '初始化计数器 ProgressBarForm.Show vbModeless '显示进度条窗口 For Each r In Range("A:QE") arr = Split(r, ",") r.Interior.Color = RGB(CInt(arr(0)), CInt(arr(1)), CInt(arr(2))) count = count + 1 '每处理一个单元格计数器加一 ProgressBarForm.Label1.Caption = "Loading..." & count / total * 100 & "%" '更新进度条 DoEvents '刷新窗口,防止窗口假死 Next Unload ProgressBarForm '关闭进度条窗口 Exit Sub '正常退出子过程 ErrorHandler: '错误处理程序 MsgBox "Error: " & Err.Description '显示错误消息 End Sub ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值