public class MainActivity extends AppCompatActivity {
TextView textview;
Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textview = findViewById(R.id.textview);
}
public void click (View view){
handler = new Handler(Looper.getMainLooper());
new Thread(new Runnable() {
@Override
public void run() {
handler.post(new Runnable() {
@Override
public void run() {
textview.setText("test thread");
}
});
}
}).start();
}
}
源码分析:
public Handler(Looper looper) {
this(looper, null, false);
}
public Handler(Looper looper, Callback callback, boolean async) {
mLooper = looper;
mQueue = looper.mQueue;
mCallback = callback;
mAsynchronous = async;
}
// 看下面 post 的调用关系
public final boolean post(Runnable r)
{
return sendMessageDelayed(getPostMessage(r), 0);
}
public final boolean sendMessageDelayed(Message msg, long delayMillis)
{
if (delayMillis < 0) {
delayMillis = 0;
}
return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}
public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
MessageQueue queue = mQueue;
if (queue == null) {
RuntimeException e = new RuntimeException(
this + " sendMessageAtTime() called with no mQueue");
Log.w("Looper", e.getMessage(), e);
return false;
}
return enqueueMessage(queue, msg, uptimeMillis);
}
// handler 所有消息发送最后都调用了这个方法,实质就是将Handler的消息加入到消息队列中
private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
msg.target = this;
if (mAsynchronous) {
msg.setAsynchronous(true);
}
//加入MessageQueue 消息队列
return queue.enqueueMessage(msg, uptimeMillis);
}
// Looper.loop()会从MessageQueue里面循环取消息,消息出去来的时候会回调这个方法
public void dispatchMessage(Message msg) {
//首先判断msg 有没有callback,这里的callback 就是handler.post()传入的Runnable
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
//callback是空执行handler 回调
handleMessage(msg);
}
}
上面代码调用了handler 的三个参数的构造方法,这个方法主要是拿Looper 的 MessageQueue 对象,主要是 将消息加入到消息队列中。