1. 为什么要使用Handle
- 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;
}
}
}