`
chriszeng87
  • 浏览: 720363 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在非UI线程中使用Handler实现请求队列

阅读更多

Handler是Android中非常重要的类之一,通过Handler可以实现主线程的延时操作和线程之间的通信,通过在子类中的Handle、和Looper可以很轻松的实现一个请求队列。

在写代码之前首先简要的说一下 Handler、Looper、MessageQuene之间的关系。

每一个线程最多有一个Looper、一个Looper里边含有一个MessageQuene。

Handler每次将消息发送到MessageQuene中,Looper用过一个死循环不断的从MessageQuene中获取消息,获取后,根据Message的target分发给对应的Handler进行处理。

下边是我写的一个通过Handler和Looper实现的请求队列:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package com.hou.looper;
 
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
 
public class DemoLooperActivity extends Activity {
    private MyThread myThread = new MyThread();
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        /*********** 模拟两个任务 ***********/
        postToNoneUIThread(new Runnable() {
 
            @Override
            public void run() {
                try {
                    Log.e("", "5 start");
                    Thread.sleep(5000);
                    Log.e("", "5 end");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        postToNoneUIThread(new Runnable() {
 
            @Override
            public void run() {
                try {
                    Log.e("", "1 start");
                    Thread.sleep(1000);
                    Log.e("", "1 end");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
 
            }
        });
        /*********** 模拟两个任务OVER ***********/
 
    }
 
    public void runOnNoneUIThread(Runnable r) {
        new Thread(r).start();
    }
 
    /**
     * 放入到子线程队列中
     * */
    public void postToNoneUIThread(Runnable r) {
        // 执行到这里的时候,子线程可能尚未启动,等待子线程启动,等待的时间会很短,
        while (myThread.handler == null) {
        }
        myThread.handler.post(r);
        myThread.handler.sendEmptyMessage(100);
    }
 
    /**
     * 可以设计为网络请求队列
     * */
    class MyThread extends Thread {
        {
            start(); // 类加载完成后直接启动
        }
        private Handler handler;
 
        @Override
        public void run() {
            while (true) {
 
                Looper.prepare(); // 创建该线程的Looper对象
                handler = new Handler(Looper.myLooper()) {
                    public void handleMessage(android.os.Message msg) {
                        Log.i("handleMessage", "" + msg.what);
                    };
                };
 
                Looper.loop(); // 这里是一个死循环
                // 此后的代码无法执行
            }
        }
    }
}

 

转自:http://www.cnblogs.com/ihou/archive/2012/08/28/2660655.html

分享到:
评论

相关推荐

    android使用handlerthread创建线程示例

    在android开发中,一说起线程的使用,...这样创建的handler是在主线程即UI线程下的Handler,即这个Handler是与UI线程下的默认Looper绑定的。Looper是用于实现消息队列和消息循环机制的。因此,如果是默认创建Handler

    Android 线程开发 开发实例

    些有Looper的线程,不管是UI线程还是子线程,只要你有Looper,我就可以往你的消息队列里面添加东西,并做相应的处理。 但是这里还有一点,就是只要是关于UI相关的东西,就不能放在子线程中,因为子线程是不能操作UI...

    Android使用Handler实现定时器与倒计时器功能

    Handler的最常见应用场景之一便是通过Handler在子线程中间接更新UI。Handler的作用主要有两个:一是发送消息;二是处理消息,它的运作需要底层Looper和MessageQueue的支撑。MessageQueue即消息队列,它的底层用...

    android开发教程之子线程中更新界面

    每个Handler对象与创建它的线程相关联,并且每个...由于Android要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面。 通过Runnable在子线程中更新界面的例子 在onCreate中创建Handler 代码如下:p

    深入理解Android中的Handler异步通信机制

    一、问题:在Android启动后会在新进程里创建一个主线程,也叫UI线程(非线程安全)这个线程主要负责监听屏幕点击事件与界面绘制。当Application需要进行耗时操作如网络请求等,如直接在主线程进行容易发生ANR错误。...

    android_handler学习笔记

    Handler在android里负责发送和处理消息。它的主要用途有(或者是干什么的):  1)执行计划任务,按计划(定时)发送... 2)线程间通信,把从其他线程中发送来的消息放入消息队列中,避免线程冲突(常见于更新UI线程)

    Android Handler多线程详解

     Android的消息传递机制是另外一种形式的“事件处理”,这种机制主要是为了解决Android应用中多线程的问题,在Android中不 允许Activity新启动的线程访问该Activity里的UI组件,这样会导致新启动的线程无法改变UI...

    Android Handler的作用与用法

    1.什么是handler? Handler是Android SDK来处理异步消息的核心类。...可以通过Handler将Message和Runnable对象发送到该Handler所关联线程的MessageQueue(消息队列)中,然后该消息队列一直在循环拿出一个Message,对其

    android+多线程机制的讲解和例子

    1.Looper:一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。 2.Handler:你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper(从Message Queue...

    Android中Handler消息传递机制

    由于Android要求在UI线程中更新界面,因此,可以通过该方法在其它线程中更新界面。 出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题。为了解决这...

    android 服务组件多线程交互

    android 的service和activity是运行在UI主线程的。在android线程中,只有主线程即UI线程有自己的默认的消息队列。子线程需要创建自己的消息队列,并把消息发给队列,并循环起来,发给handler处理。

    Android 消息队列模型详解及实例

    Android中除了UI线程(主线程),创建的工作线程默认是没有消息循环和消息队列的。如果想让该线程具有消息队列和消息循环,并具有消息处理机制,就需要在线程中首先调用Looper.prepare()来创建消息队列,然后调用...

    Handler+Looper+MessageQueue+Message机制

    当子线程中进行耗时操作后需要更新UI时,通过Handler将有关的UI操作切换到主线程中执行。 四要素: Message(消息):需要被传递的消息,其中包含了消息标识(what),消息处理数据和处理对象(arg1,arg2,obj),发送...

    Android开源框架EventBusAndroid.zip

    如果当前线程是UI线程,事件会被加到一个队列中,由一个线程依次处理这些事件,如果某个事件处理时间太长,会阻塞后面的事件的派发或处理。onEventAsync:事件处理会在单独的线程中执行,主要用于在后台线程中执行...

    CommonUtils:一些常用的请求 下拉刷新 手势、以及一些常用的自定义控件等,方便维护 及时更新

    CommonUtils ...该框架 支持文件上传 下载 get post 同步,缓存等一些操作,不在主线程中操作,只在主线程中请求接口,在子线程中请求数据,在handler 中刷新UI。 增加 get方式请求 数据,在handler中刷

    android-thread-producer-consumer-example:线程之间的ProducerConsumer模型示例

    在讲完Looper,Handler和HandlerThread一章之后,一位学生问我们如何将流数据(从传感器)从后台线程传递回主线程... 后台线程只是将消息转储到队列中,而不用担心它们是否被足够快地读取。 如果UI线程不能足够快地处

    Android消息机制Handler的工作过程详解

    这个UI线程是在应用第一次启动时开启的,也称之为主线程(Main Thread),该线程专门用来操作UI组件,在这个UI线程中我们不能进行耗时操作,否则就会出现ANR(Application Not Responding)现象。如果我们在子线程中去...

    Android消息处理机制Looper和Handler详解

    使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等。 MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行。当然,存放Message并非实际意义...

    代码分析Android消息机制

    熟悉开发的朋友都知道在子线程中默认是无法创建Handler的,这是因为子线程中不存在消息队列。当需要创建一个与子线程绑定的Handler时,标准代码如下: class LooperThread extends Thread { public Handler ...

    android handler.post和handler.sendMessage的区别和联系

    通过看源码发现,post这个方法是把任务r转成一个message放进了handler所在的线程中的messageQueue消息队列中,并且是立刻发送的消息,这样它既不是异步的也不是延时的,所以问题来了: 1. 它和sendMessage()有什么...

Global site tag (gtag.js) - Google Analytics