【达内课程】线程——Handler与Looper(四)

这里写图片描述

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

这里写图片描述

猜你喜欢

转载自blog.csdn.net/u010356768/article/details/80584597