Handler简单用法
Handler是什么:
Android系统中线程间传递消息的一种机制.
Android中UI组件中的信息传递Handler,Android为了线程安全,并不允许在UI线程外操作UI;很多时候UI界面刷新需要通过Handler来通知UI组件更新。
Handler机制中最重要的四个对象。
Handler:负责发送消息及处理消息。
Looper:复制不断的从消息队列中取出消息,并且给发送本条消息的Handler。
MessageQueue:负责存储消息。
Message:消息本身,负责携带数据。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button button;
private TextView textView;
private int number = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button);
button.setOnClickListener(this);
textView = findViewById(R.id.textView);
}
private Handler handler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
//根据 message 判断来处理不同的事务
if (msg.what == 101) {
number++;
textView.setText(String.valueOf(number));
} else if (msg.what == 102) {
number = 999;
textView.setText(String.valueOf(number));
}
}
};
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
//定时发送
new Timer().schedule(new TimerTask() {
@Override
public void run() {
//发送空 message
handler.sendEmptyMessage(101);
}
},0,1000);
//发送 message
// Message message = new Message();
// message.what = 102;
// handler.sendMessage(message);
break;
}
}
}
以上Handler也还是运行在UI线程中
以下是在子线程中更新UI 使用Handler ↓↓↓↓↓↓
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button button;
private TextView textView;
private int number = 0;
private MyThread myThread ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button);
textView = findViewById(R.id.textView);
button.setOnClickListener(this);
//创建一个新线程
myThread = new MyThread();
//启动线程
myThread.start();
}
//创建一个线程
class MyThread extends Thread{
public Handler handler;
@Override
public void run() {
super.run();
//创建一个 Looper
Looper.prepare();
handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == 101){
//处理数据
number++;
//通知 UI 线程来刷新UI
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
//更新 UI
textView.setText(String.valueOf(number));
}
});
}
}
};
//循环读取
Looper.loop();
}
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button:
//发送消息
myThread.handler.sendEmptyMessage(101);
break;
}
}
}