xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.ThirdActivity">
<Button
android:id="@+id/btn_send_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发出消息"/>
</LinearLayout>
activity
public class ThirdActivity extends AppCompatActivity implements View.OnClickListener{
private Button btnSendMsg;
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
btnSendMsg = findViewById(R.id.btn_send_msg);
btnSendMsg.setOnClickListener(this);
handler = new Handler(new InnerHandlerCallback());
}
@Override
public void onClick(View view) {
//发出消息
Message msg = Message.obtain(handler);
msg.sendToTarget();
Log.d("Handler","[Thread ID:]"+Thread.currentThread().getId()+" MainActivity onclick()->send message");
}
private class InnerHandlerCallback implements Handler.Callback{
@Override
public boolean handleMessage(Message message) {
Log.d("Handler","[Thread ID:]"+Thread.currentThread().getId()+" InnerHandlerCallback handleMessage()->handle message");
return false;
}
}
}
打印日志
D/Handler: [Thread ID:]1 MainActivity onclick()->send message
06-05 09:48:28.550 8589-8589/com.example.xx.myapplication2 D/Handler: [Thread ID:]1 InnerHandlerCallback handleMessage()->handle message
从日志可以看出Handler是运行在主线程的
现在修改onClick中代码,把发送消息放在子线程中
@Override
public void onClick(View view) {
new Thread(){
@Override
public void run() {
//发出消息
Message msg = Message.obtain(handler);
msg.sendToTarget();
Log.d("Handler","[Thread ID:]"+Thread.currentThread().getId()+" MainActivity onclick()->send message");
}
}.start();
}
运行程序,查看日志,可以看到发消息在子线程,处理消息还是在主线程
D/Handler: [Thread ID:]281 MainActivity onclick()->send message
D/Handler: [Thread ID:]1 InnerHandlerCallback handleMessage()->handle message
如果把创建Handler也放在子线程中
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
......
new Thread(){
@Override
public void run() {
Looper.prepare();
handler = new Handler(new InnerHandlerCallback());
Looper.loop();
Log.d("Handler","[Thread ID:]"+Thread.currentThread().getId()+" MainActivity onCreate()->sub thread->new Handler");
}
}.start();
}
运行程序,观察日志,会发现handle message 是同一个线程
[Thread ID:]290 MainActivity onCreate()->sub thread->new Handler
[Thread ID:]290 InnerHandlerCallback handleMessage()->handle message
[Thread ID:]293 MainActivity onclick()->send message
[Thread ID:]290 InnerHandlerCallback handleMessage()->handle message
[Thread ID:]294 MainActivity onclick()->send message