一.为什么要用Handler
1.子线程不能更改主线程的UI
2.一般来说,所有显示在界面上的控件,都是由主线程创建的
3.每个主线程都有一个Handler,Handler运行在主线程里,它与子线程可以通过Message对象来传递数据
二.什么是Handler
1.Handler是Android SDK中处理异常消息的核心类
2.Handler的作用是让子线程通过与UI线程通信来更新UI界面
三.什么是Looper
1.在Android中创建出的普通线程默认是没有消息循环的,run方法执行完毕,线程也就结束了。
2.如图让线程不停的循环工作时,可以使用LooPer,将普通线程变成循环工程线程。
四.什么是MessageQueue
1.当创建Looper是,将会自动创建出MessageQueue.
2.一个线程中只存在一个Looper和一个MessageQueue。
3.当MessageQueue中有消息时,Looper将从MessageQueue中取出消息。
五.Handler怎么用
1.创建一个Handler对象,系统就把Handler对象、UI线程和UI线程的消息队列捆绑起来。
2.当我们在线程中处理数据后,可以通过Handler对象将消息发送出来。
3.消息将会按先后顺序添加到消息队列中。
4.UI线程中的Looper不断从消息队列中取出消息,刷新UI。
如图所示:
6.案例解析—-倒计时Demo
首先在Activity中创建一个UI界面,代码如下:
<TextView
android:id="@+id/down_tv"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="准备..."
android:textSize="25dp"
android:gravity="center"/>
<Button
android:id="@+id/down_btn"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="开始"/>
效果如图:
Java代码如下:
package com.example.androidthree;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class DownloadActivity extends AppCompatActivity implements View.OnClickListener {
private TextView down_tv;
private Button down_btn;
private int count=10;
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what==-1){
down_tv.setText("结束");
}else {
down_tv.setText(msg.what+"");
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_download);
bindID();
}
private void bindID() {
down_tv=findViewById(R.id.down_tv);
down_btn=findViewById(R.id.down_btn);
down_btn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.down_btn:
new Thread(new Runnable() {
@Override
public void run() {
while (count>0){
try {
handler.sendEmptyMessage(count);
count--;
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
handler.sendEmptyMessage(-1);
}
}).start();
break;
}
}
}
最好运行效果如图: