第一行代码——服务(1)多线程编程中异步消息处理

服务:是Android中实现程序中后台运行的解决方案,它的运行不依赖任何用户界面,而是依赖于创建服务时所在的应用程序的进程。服务不会自动开启线程,所有的代码都默认运行在主线程中。

创建并启动线程:使用匿名内部类

new Thread(new Runabble(){
    @Override
    public void run(){
    //处理具体的逻辑
    }
}).start();

Android不允许在子线程中进行UI操作,但有时候我们必须在子线程里执行一些耗时的任务,然后根据任务的结果来更新相应的UI控件,对于这种情况,Android提供了一套异步消息处理的使用方法。

**解析异步消息处理机制:**主要由4个部分组成

  1. Message:传递消息,用于在不同线程之间交换数据。Message的what字段用于用户自定义消息,arg1和arg2字段携带整形数据,obj字段携带一个Object对象。

  2. Handler:用于发送和处理消息。发送消息一般使用Handler的sendMessage()方法,发出的消息传递到Handler的handleMessage()方法中。

  3. MessageQueue:用于存放所有通过Handler发送的消息,每个线程只会有一个Message对象。

  4. Looper:调用Looper的loop()方法会进入到无限循环中,每当发现MessageQueue中有一条消息,就会取出将其传递到Handler的handlerMessage()方法中。每个线程也只由一个Looperd对象。

异步消息处理流程
(1)在主线程中创建一个Handler对象,并重写handleMessage()方法。
(2)当子线程需要进行UI操作时,创建一个Message对象,并通过Handler将这条消息发送出去。
(3)这条消息被添加到MessageQueue的对列中等待处理,Looper会一直尝试从队列中读取待处理消息发送给Handler的handleMessage方法中。
(4)由于Handler在主线程中创建,故此时handleMessage()方法中的代码在主线程中运行。

例如我们想实现点击按钮改变TextView显示的内容。则在MainActivity中实现过程如下:

  1. 定义一个整形常量UPDTATE_TEXT,用于表示更新TextView这个动作
    在这里插入图片描述
    2.新增一个Handler对象,并重写父类的handleMessage()方法,在这里对具体的Message进行处理。第一行代码——服务(1)多线程编程中异步消息处理_第1张图片
    3.编写按钮点击事件的代码。这次我们并没有在子线程里直接进行UI操作,而是创建了一个Message(android.os.Message)对象,并将what字段的值指定为UPDATA_TEXT,调用Handler的sendMessage()将这条Message发送出去。很快Handler收到这条Message,并在handleMessage()进行操作。
    第一行代码——服务(1)多线程编程中异步消息处理_第2张图片
    现在运行程序,屏幕上显示一句话,点击按钮,显示的内容被替换成Nice to meet you。

你可能感兴趣的:(第一行代码——服务(1)多线程编程中异步消息处理)