博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 消息传递之Bundle的使用——实现object对象传输(一)
阅读量:5921 次
发布时间:2019-06-19

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

UI更新——消息处理massage  

  对于安卓内部消息得处理,实现对界面UI得更新操作,不能在线程中直接更新ui。至于为什么不能,在学习安卓开发的时候,在线程中操作会使程序崩溃。

为什么,可以看看诸多大神们的详细介绍。

  安卓内部处理数据更新UI都是耗时的操作,这些耗时操作系统不允许在Activity主线程中进行,必须在其他线程中操作,然后通过发消息的形式通知主线程更新UI,那么我们就要用多线程处理了,massage 消息处理机制。

  下面我们一起分享郭霖Android多线程中消息处理更新UI的介绍。

   通过一个具体的例子来验证一下吧。新建一个 AndroidThreadTest 项目,然后修改 activity_main.xml 中的代码,如下所示:

1 
4
9
16

布局文件中定义了两个控件,TextView 用于在屏幕的正中央显示一个 Hello world 字符串,Button 用于改变 TextView 中显示的内容,我们希望在点击 Button 后可以把 TextView中显示的字符串改成 Nice to meet you。接下来 MainActivity 中的代码,如下所示:

1 public class MainActivity extends Activity implements OnClickListener { 2     public static final int UPDATE_TEXT = 1; 3     private TextView text; 4     private Button changeText; 5     private Handler handler = new Handler() { 6         public void handleMessage(Message msg) { 7             switch (msg.what) { 8             case UPDATE_TEXT: 9                 // 在这里可以进行UI 操作10                 text.setText("Nice to meet you");11                 break;12             default:13                 break;14             }15         }16     };17     ……18 19     @Override20     public void onClick(View v) {21         switch (v.getId()) {22         case R.id.change_text:23             new Thread(new Runnable() {24                 @Override25                 public void run() {26                     Message message = new Message();27                     message.what = UPDATE_TEXT;28                     handler.sendMessage(message); // 将Message 对象发送出去29                 }30             }).start();31             break;32         default:33             break;34         }35     }36 }

这里我们先是定义了一个整型常量 UPDATE_TEXT,用于表示更新 TextView这个动作。然后新增一个 Handler 对象,并重写父类的 handleMessage 方法,在这里对具体的 Message进行处理。如果发现 Message 的 what 字段的值等于 UPDATE_TEXT,就将 TextView显示的内容改成 Nice to meet you。下面再来看一下hange Text 按钮的点击事件中的代码。可以看到,这次我们并没有在子线程里直接进行 UI 操作,而是创建了一个 Message(android.os.Message)对象,并将它的 what 字段的值指定为 UPDATE_TEXT,然后调用 Handler 的 sendMessage()方法将这条Message 发送出去。很快,Handler 就会收到这条 Message,并在 handleMessage()方法中对它进行处理。注意此时 handleMessage()方法中的代码就是在主线程当中运行的了,所以我们可以放心地在这里进行 UI 操作。接下来对 Message 携带的 what 字段的值进行判断,如果等于UPDATE_TEXT,就将 TextView显示的内容改成 Nice to meet you。现在重新运行程序,可以看到屏幕的正中央显示着 Hello world。然后点击一下 ChangeText按钮,显示的内容着就被替换成 Nice to meet you,如图:

  使用Massage消息机制处理ui线程,简单操作。接下来解析异步消息处理机制的到底是如何工作的。

  Android 中的异步消息处理主要由四个部分组成,Message、Handler、MessageQueue和Looper。其中Message和Handler在上一小节中我们已经接触过了,而MessageQueue和Looper对于你来说还是全新的概念,下面我就对这四个部分进行一下简要的介绍。

  1. MessageMessage 是在线程之间传递的消息,它可以在内部携带少量的信息,用于在不同线程之间交换数据。上一小节中我们使用到了 Message 的 what 字段,除此之外还可以使用 arg1 和 arg2 字段来携带一些整型数据,使用 obj字段携带一个 Object 对象。

  2. HandlerHandler 顾名思义也就是处理者的意思,它主要是用于发送和处理消息的。发送消息一般是使用 Handler的SendMessage()方法,而发出的消息经过一系列地辗转处理后,最终会传递到 Handler的 handleMessage()方法中。

  3. MessageQueueMessageQueue是消息队列的意思,它主要用于存放所有通过 Handler发送的消息。这部分消息会一直存在于消息队列中,等待被处理。每个线程中只会有一个 MessageQueue对象。

  4. LooperLooper是每个线程中的 MessageQueue的管家,调用 Looper的 loop()方法后,就会进入到一个无限循环当中,然后每当发现 MessageQueue 中存在一条消息,就会将它取出,并传递到 Handler 的 handleMessage()方法中。每个线程中也只会有一个 Looper对象。

  了解了 Message、Handler、MessageQueue 以及 Looper的基本概念后,我们再来对异步消息处理的整个流程梳理一遍。首先需要在主线程当中创建一个 Handler 对象,并重写handleMessage()方法。然后当子线程中需要进行 UI 操作时,就创建一个 Message 对象,并通过 Handler 将这条消息发送出去。之后这条消息会被添加到 MessageQueue 的队列中等待被处理,而 Looper 则会一直尝试从 MessageQueue 中取出待处理消息,最后分发回 Handler的 handleMessage()方法中。由于 Handler是在主线程中创建的,所以此时 HandleMessage()方法中的代码也会在主线程中运行,于是我们在这里就可以安心地进行 UI 操作了。整个异步消息处理机制的流程示意图:

  一条 Message 经过这样一个流程的辗转调用后,也就从子线程进入到了主线程,从不能更新 UI 变成了可以更新 UI,整个异步消息处理的核心思想也就是如此。

  下面分享自己的所学所做关于安卓中的一些消息处理,信息的传递。bundle传递object对象。

转载于:https://www.cnblogs.com/nSai-sj/p/6290489.html

你可能感兴趣的文章
社会化海量数据采集爬虫框架搭建
查看>>
【笔记】wamp mysql配置密码,设置phpmyadmin不自动登录
查看>>
JavaScript创建对象的9种方式
查看>>
转一篇Linux可用内存的统计方法
查看>>
oracle的一些孤僻性错误(OCIEnvCreate failed)
查看>>
settings.xml配置的镜像
查看>>
isted系列教程三–开始twisted
查看>>
《软件需求十步走》阅读笔记4
查看>>
OUTLOOK之不能直接发送邮件的Mapi错误解决方法
查看>>
( 转 ) Android自绘字体大小paint.settextsize随分辨率大小变化
查看>>
关于MySql链接url参数的设置 专题
查看>>
Python 目录操作(转)
查看>>
java 二维码原理以及用java实现的二维码的生成、解码(转)
查看>>
log4net小结
查看>>
支线任务-4
查看>>
【PHP】最详细PHP从入门到精通(一)——想学习PHP的朋友们福利来了!
查看>>
[android] 帧布局
查看>>
iis6 zencart1.39 伪静态规则
查看>>
java使用jxl,poi解析excel文件
查看>>
vue的入门
查看>>