博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android-Handler初体验
阅读量:3943 次
发布时间:2019-05-24

本文共 3424 字,大约阅读时间需要 11 分钟。

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,就是周而复始的这样的一个过程

  • 参考博客: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组件

  • 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布局文件

  • 6.1.5 效果预览

    android-handler.gif

你可能感兴趣的文章
redis
查看>>
word2vec参数
查看>>
python的collections
查看>>
LDA和PCA
查看>>
推荐分解:介绍SVD、SVD++
查看>>
FM详解
查看>>
二叉树遍历
查看>>
推荐方法的比较
查看>>
LDA主题模型
查看>>
《集体智慧编程》-优化算法
查看>>
hadoop和spark详解
查看>>
推荐之召回和排序
查看>>
基于社交的推荐
查看>>
Lookalike理解
查看>>
vscode插件
查看>>
MTL多任务学习-Multitask Learning
查看>>
graph-embedding
查看>>
HMM隐马尔科夫模型
查看>>
开发中关键字区别
查看>>
python的=、copy和deecopy详细区别
查看>>