Android 消息传递之Bundle的使用——实现object对象传输(一)

UI更新——消息处理massage  

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

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

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

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

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

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2 android:layout_width="match_parent"
 3 android:layout_height="match_parent" >
 4 <Button
 5 android:id="@+id/change_text"
 6 android:layout_width="match_parent"
 7 android:layout_height="wrap_content"
 8 android:text="Change Text" />
 9 <TextView
10 android:id="@+id/text"
11 android:layout_width="wrap_content"
12 android:layout_height="wrap_content"
13 android:layout_centerInParent="true"
14 android:text="Hello world"
15 android:textSize="20sp" />
16 </RelativeLayout>

布局文件中定义了两个控件,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     @Override
20     public void onClick(View v) {
21         switch (v.getId()) {
22         case R.id.change_text:
23             new Thread(new Runnable() {
24                 @Override
25                 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对象。

时间: 2024-10-02 12:46:15

Android 消息传递之Bundle的使用——实现object对象传输(一)的相关文章

Android 消息传递之Bundle的使用——实现object对象传输(二)

上面学习了线程通过Massage发送字符串消息,Handler接收字符串消息,这样的形式来更新ui,接下来,一起分享怎么把一个对象利用消息机制发送出去,让主线程接收来更新ui. 下面就利用一个服务Server,Handler,Activity,和一个对象类分享具体实现情况. 首先创建一个个类,什么都行.例如: 1 package dfrz.me.android.pcfileshare.bean; 2 3 import java.io.Serializable; 4 5 /** 6 * 描述:广告

Android消息传递之基于RxJava实现一个EventBus - RxBus(四)

前言: 上篇文章学习了Android事件总线管理开源框架EventBus,EventBus的出现大大降低了开发成本以及开发难度,今天我们就利用目前大红大紫的RxJava来实现一下类似EventBus事件总线管理,现在很多人都在说用这种方式来替代EventBus,今天我们从开发效率,开发难度等维度来分析一下到底能不能取代EventBus? 先回顾一下什么是EventBus?请看这篇文章Android消息传递之EventBus 3.0使用详解(三) 需求: 虽然软件工程师就害怕听见“需求”这两个字,

Android Bundle传递简单数据、对象数据

Android开发过程中进程遇到组件之间.进程之间等数据的传递,数据传递有很多种,其中使用Bundle传递非常方便. Bundle可以传递多种数据,是一种类似map的key-value数据结构 简单的调用如下所示 Bundle bundle=new Bundle(); bundle.put***(key,value) 但是有时候需要我们传递一个对象,做法就是先把该对象使用serializable序列化 public class Book implements Serializable{ } 然后

Android消息传递机制

背景需求 在Android中,当遇到子线程需要刷新UI时,最常的做法就是handler,当然还有其他方便的方法如Android给我们提供的runOnUiThread(runnable)方法,但归根结底都是使用handler来刷新UI的. Android消息传递原理 简单的讲:handler发送(post或send)一条消息:MessageQueue(队,实际上是一个用单链表实现的队列)接受并存储该消息:looper无限循环的从MessageQueue中取出一条消息,例如msg,然后调用msg.t

Android间的进程通讯(传递复杂对象)

Android间的进程通讯(传递复杂对象) 完成对复杂对象的序列化 在Android中传递复杂数据类型的时候要通过将序列化,在Android中提供了一个接口Parcelable来实现对对象的序列化. 下面对需要传输的对象进行序列化操作,首先看自定义的类Person. package com.example.service_parcelable_conmmute.bean; import android.graphics.Bitmap; /** * 用来传输的对象结构 * @author Xiny

android 在子线程中如何把自定义对象传到handler中处理

一般来说,Thread中要把数据传出去就用message. bundle.handler来配合使用,代码如下 Message msg=new Message(); Bundle b=new Bundle(); b.putString("context", object.toString()); msg.setData(b); Log.e("OUT", object.toString()); handler.sendMessage(msg); 但是,bundle能存的

Object对象类

Object对象类是所有类的祖先,他是默认自动继承的 Java为什么要做一个对象类呢?对象类的目的就是归一了类型,他就是把所有的类所有的对象归纳成为 Object类型.因为对象他认为对象应该拥有一些什么方法和属性全部都定制下来.那么就也就规定了今后的都有哪些方法和属性. toString():String方法是父类留下来的一个方法,如果不重写那么就由Object来实现,如果重写那么这个方法就能写很多的东西.toString()方法其实 是用来打印一些类的信息来说明类的一些问题, toString

atitit.XML类库选型及object 对象bean 跟json转换方案

atitit.XML类库选型及object 对象bean 跟json转换方案 1. XML类库可以分成2大类.标准的.这些类库通常接口和实现都是分开的 1 2. 常见的xml方面的方法 2 2.1. xml解析 2 2.2. bean与xml互相转换 2 2.3. json与xml的互相转换 2 3. 大名鼎鼎的 DOM  绿色环保的 SAX 默默无闻的 Digester 2 3.1. 默默无闻的 Digester:XML 的 JavaBean 化 2 4. Digester 解析 XML 3

java学习中,object 对象的使用(toString、equals、hashCode)(java 学习中的小记录)

java学习中,object 对象的使用(java 学习中的小记录)作者:王可利(Star·星星) object 对象(参考API学习) 重点掌握三个方法: 1.toString 返回该对象的字符串表示. 2.equals(object obj)指示其他某个对象是否与这个对象相等. 3.hashCode() 返回对象的哈希码. 详见代码的注释分析(一个是Person类重写方法,一个是Star类使用方法) Star类代码: 1 package study; 2 3 public class sta