Android-Handler初体验

6、有用的Handler

  • 多线程与异步
  • 什么是Handler?
    • A Handler allows you to send and process Message and Runnable objects associated with a thread’s MessageQueue
  • 用来做什么?
    • 定时执行Message和MessageQueue
    • 在不同线程中执行

Handler怎么使用

Handler处理消息(Message),Message放在Message队列里(MessageQueue),然后Looper会把消息取出来给Handler,Handler会去处理,处理完成后,Looper再从MessageQueue里再给Handler,就是周而复始的这样的一个过程

  • Handler是什么

    参考博客:https://blog.csdn.net/qq_37321098/article/details/81535449

  • 如何使用

    • obtainMessage() 取得消息
    • sendMessage() 发送消息
    • handleMessage() 处理消息

Message和MessageQueue

  • Message

    • 2个整形数值:轻量级存储int类型的数据
    • 一个Object:任意对象
    • replyTo:线程通信的时候使用
    • What:用户自定义的消息码让接收者识别消息
  • MessageQueue

    • Message的队列
    • 每一个线程最多只可以拥有一个
    • Thread -> Looper -> MessageQueue
    Fields
    public static final Creator CREATOR
    public int arg1
    public int arg2
    public Object obj
    public Messager replyTo
    public int sendingUid
    public int what

Message、MessageQueue和Looper

  • Message
    • 2个整形数值
    • 一个Object
  • MessageQueue
    • Message的队列
  • Looper
    • 消息泵

Looper的原理

  • Looper是做什么的?
    • 是MessageQueue的管理者
    • Looper.prepare()
    • 每一个Looper对象和一个线程关联
    • Looper.myLooper()可以获得当前线程的Looper对象
  • 如何使用?
    • Looper从MessageQueue中取出Message
    • 交由Handler的handleMessage进行处理
    • 调用Message.recycle()将其放入Message Pool中

6.1 用Message做一个倒计时实例

  • 6.1.1 在activity_main.xml中添加一个Button组件

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        tools:context=".MainActivity">
    
        <Button
            android:id="@+id/handlerBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="130dp"
            android:textAllCaps="false"
            android:text="handler_button"/>
    
    RelativeLayout>
    
  • 6.1.2 在MainActivity中为Button按钮添加点击事件

    public class MainActivity extends AppCompatActivity {
    
        private Button mButton;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mButton = findViewById(R.id.handlerBtn);
            mButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(MainActivity.this, HandlerButtonActivity.class);
                    startActivity(intent);
                }
            });
        }
    }
    
  • 6.1.3 创建HandlerButtonActivity类并继承Handler

    public class HandlerButtonActivity extends AppCompatActivity {
        public static final int MESSAGE_CODE = 8888;
        private static TextView mTextView;
        private TestHandler mTestHandler = new TestHandler();
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_handler);
             /* 发送消息 */
    
            mTextView = findViewById(R.id.handler_text_view);
    
            Message message = mTestHandler.obtainMessage(); // 取得一条消息
            message.arg1 = 0;
            message.arg2 = 1;
            message.what = MESSAGE_CODE;
            message.obj = 10000;
    
            // 延迟发送消息 sendMessageDelayed(消息, 延迟时间)
            mTestHandler.sendMessageDelayed(message, 1000);
        }
    
        public static class TestHandler extends Handler {
    
            @Override
            public void handleMessage(@NonNull Message msg) { // 处理消息
                super.handleMessage(msg);
                /* 接收消息 */
                switch (msg.what) {
                    case MESSAGE_CODE:
                        int value = (int) msg.obj;
                        mTextView.setText(String.valueOf(value/1000));
    
                        msg = Message.obtain();
                        msg.arg1 = 0;
                        msg.arg2 = 1;
                        msg.what = MESSAGE_CODE;
                        msg.obj = value - 1000;
                        if (value > 0) {
                            sendMessageDelayed(msg, 1000);
                        }
    
                        break;
                }
            }
        }
    }
    
  • 6.1.4 新建一个activity_handler.xml布局文件

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_horizontal">
    
        <TextView
            android:id="@+id/handler_text_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="40sp"
            android:text="有用的Handler"/>
    
    RelativeLayout>
    
  • 6.1.5 效果预览

    Android-Handler初体验_第1张图片

你可能感兴趣的:(Android,android,java,移动开发,xml)