1.Handler是什么?
提供用来更新UI的一套机制,是一套消息处理机制,可以用它来发消息和处理消息
2.为什么要使用Handler?
子线程不能更改主线程UI(因为主线程不能做耗时操作)。主线程和子线程可通过Message对象传递参数。
案例1:3秒之后发送消息让Handler更新主线程里的text
1.Handler h=new Handler()里面重写handleMessage方法(处理消息,对主线程更新)
Handler h = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
2.在activity_main.xml中写个TextView
<TextView
android:text="10"
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"></TextView>
3.在后台
1)耗时操作: 线程执行完之后停止1秒钟Thread.sleep(1000);
2)给Handler 发消息 h .sendMessage(Message:m);
3)创建Message:Message m = Message.obtain();静态方法(最好这种)
也可以Message m = new Message();
4)发送类似请求码,判断是哪个线程 m .what = 100;
5)携带的参数 m .obj=“哈哈哈”;
6)在Handler里对请求码做判断
Handler h = new Handler(){
@Override
public void handleMessage(Message msg) {
if (msg.what == 100){
tv.setText(msg.obj+"");
}
}
};
总结:obj把“哈哈哈”携带过来,通过.sendMessage(Message:m)方法发送到Handler(){}里,Handler(){}里的handleMessage对主线程进行更新
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
Handler h = new Handler(){
@Override
public void handleMessage(Message msg) {
if (msg.what == 100){
tv.setText(msg.obj+"");
}
}
};
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findViewById(R.id.tv);
new Thread(){
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message m = Message.obtain();
//发送类似请求码,判断是哪个线程
m.what = 100;
//携带的参数
m.obj="哈哈哈";
h.sendMessage(m);
}
}.start();
}
}
案例2:倒计时
1.在activity_main.xml中写个TextView
<TextView
android:id="@+id/tv"