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) 通过Thread类的构造方法创建线程对象,并重写run()方法,
2)通过实现Runnable接口,实现其中的run()方法 - 开启线程:通过Thread类提供的start()方法
- 线程休眠:通过sleep(long time)的参数time指定休眠时间
- 中断线程: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]); //设置图片显示
}
}
};
}
});
}
}