本文简记 Handler 的常用方法。
常用 postDelayed()
方法。
示例:
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "3000毫秒事件计划", Toast.LENGTH_LONG).show();
}
}, 3000);
示例:
Handler handler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
Toast.makeText(getApplicationContext(), "线程间通信成功", Toast.LENGTH_LONG).show();
break;
}
}
};
new Thread() {
@Override
public void run() {
super.run();
Message message = new Message();
message.what = 1;
handlerMsg.sendMessage(message);
}
}.start();
但是这样的写法已经被弃用了。
示例:
首先在实现子线程 new Thread()
的方法外写一个继承 Handler 的静态子类:
private static class HandlerMsg extends Handler {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 10001:i
Log.i(">>>>==== GET HandlerMsg ====<<<< : ", "msg.what = "+msg.what+", obj = "+(String)msg.obj);
break;
}
}
}
然后在子线程 new Thread()
所在的方法下声明该类的对象,再在子线程 new Thread()
中调用:
public void threadSendMsg() {
final HandlerMsg handlerMsg = new HandlerMsg();
new Thread() {
@Override
public void run() {
super.run();
Message message = new Message();
message.what = 10001;
message.obj = "yogile";
handlerMsg.sendMessage(message);
}
}.start();
}
将 threadSendMsg()
通过按钮控件触发,运行结果:
2020-07-08 19:25:39.862 5901-5901/com.yogile.running D/>>>>==== GET HandlerMsg ====<<<< : msg.what = 1, obj = yogile
可以使用 Callback()
实现 线程间的即时数据通信。
示例:
threadSendMsg()
可以不变化,setHandler()
可在 onCreate()
中调用。
public class MainActivity extends AppCompatActivity {
......
Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
......
setHandler();
......
}
/**
* 初始化 handler
*/
private void setHandler() {
handler = new Handler(new Handler.Callback() {
@SuppressLint("LongLogTag")
@Override
public boolean handleMessage(@NonNull Message message) {
switch (message.what) {
case 1001:
Log.d(">>>>==== GET HandlerMsg ====<<<< : ", "msg.what = "+msg.what+", obj = "+(String)msg.obj);
break;
default:
throw new IllegalStateException("Unexpected value: " + message.what);
}
return false;
}
});
}
public void threadSendMsg() {
final HandlerMsg handlerMsg = new HandlerMsg();
new Thread() {
@Override
public void run() {
super.run();
Message message = new Message();
message.what = 10001;
message.obj = "yogile";
handlerMsg.sendMessage(message);
}
}.start();
}
}
原文:https://www.cnblogs.com/Yogile/p/13268881.html