`
chriszeng87
  • 浏览: 736832 次
  • 性别: 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

分享到:
评论

相关推荐

    ndroid异步处理一:使用Thread+Handler实现非UI线程更新UI界面

    因此,当需要执行网络请求、数据库操作或大计算量的任务时,我们需要在其他线程(非UI线程)中执行。 接着,我们来看`Thread`类,它是Java中的基础线程类。通过创建`Thread`对象并调用其`start()`方法,可以开启一...

    Android_Handler的线程队列Demo

    这个"Android_Handler的线程队列Demo"旨在演示如何有效地利用Handler来处理线程间的通信,特别是主线程(UI线程)与工作线程之间的交互。下面我们将深入探讨相关知识点。 首先,了解Handler的基本概念。Handler是...

    android 更新 UI 线程 handler

    在Android开发中,更新UI(用户界面)是一个常见的任务,但是由于Android的主线程(也称为UI线程)是负责处理用户交互和绘制界面的,所以直接在后台线程进行UI更新可能会导致程序崩溃或者界面卡顿。为了解决这个问题...

    Looper和Handler实现UI线程和子线程的通信

    由于Android系统规定所有的UI操作必须在主线程(也称为UI线程)中执行,因此当需要在后台子线程进行耗时操作(如网络请求、数据库操作等)时,就需要一种机制来实现与UI线程的通信,以便更新UI。Looper和Handler正是...

    安卓UI线程机制 ,在子线程中访问UI

    理解Android的UI线程机制至关重要,因为错误地在非UI线程中操作UI组件会导致应用崩溃或出现不一致的用户界面。下面将详细阐述Android UI线程的工作原理,以及如何在子线程中安全地访问UI。 一、Android UI线程 1. ...

    无界面的UI线程交互

    而在Android中,通常会使用Handler, MessageQueue和Looper的组合来实现UI线程与工作线程之间的通信。 具体步骤如下: 1. **创建后台线程**:首先,我们需要创建一个无界面的UI线程,它会在后台运行,执行计算或其他...

    android 多线程 looper handler

    例如,我们可以在子线程中使用 Looper.prepare() 方法来准备消息队列,然后使用 Looper.loop() 方法来启动消息循环。在子线程中,我们可以使用 Handler 来发送和处理消息。 需要注意的是,在 Android 中,子线程不...

    handler实现图灵机器人-没有网络请求的版本

    总结来说,这个项目展示了如何巧妙地使用`Handler`来处理线程间的通信,尤其是在避免网络请求的情况下,通过本地数据实现图灵机器人的对话功能。这种设计对于离线环境或者网络不稳定的情况非常有用,提高了应用的...

    工作线程 UI线程实例

    这个"testmfc"可能就是一个演示如何在MFC中使用工作线程和UI线程的项目。通过分析和运行这个项目,开发者可以深入理解线程间的交互和异步编程的概念,这对于编写高效、响应的GUI程序至关重要。 总的来说,工作线程...

    android 线程之间通过Handler发送消息

    默认情况下,只有主线程有Looper,如果你需要在其他线程中使用Handler,必须先调用`Looper.prepare()`初始化Looper,然后用`Looper.loop()`启动循环。 3. **Message(消息)**:Message是实际承载数据的对象,用于...

    Android的线程使用来更新UI

    每个线程默认没有Looper,所以在新的线程中使用Handler时,需要先调用`Looper.prepare()`初始化,然后用`Looper.loop()`启动消息循环。 7. **使用Handler的最佳实践**: - 当需要从工作线程向主线程发送消息时,应...

    Android中UI线程与后台线程交互的探讨.pdf

    在Android应用开发中,UI线程(也称为主线程)负责处理用户界面的交互,而后台线程则用于执行耗时操作,如网络请求、数据库操作等,以避免阻塞UI,保证用户界面的流畅性。当后台线程完成耗时操作后,通常需要将结果...

    Android编程实现使用handler在子线程中更新UI示例

    在MainActivity中,我们创建了一个子线程,并在子线程中使用Handler对象来更新UI。我们首先调用Thread.sleep方法来模拟一些耗时操作,然后使用Handler对象的post方法来更新UI。在post方法中,我们传入了一个Runnable...

    使用handler 实现预约时间功能

    6. **注意事项**:由于Handler主要在主线程中使用,因此对于耗时的操作,不应在`Runnable`的`run()`方法或`handleMessage()`方法中执行,以免阻塞UI线程。这些操作应该放在子线程中处理,然后通过Handler更新UI。 ...

    UI线程

    Handler创建在UI线程,它发送消息到Looper队列,Looper在UI线程中循环读取并分发消息,从而允许非UI线程更新UI。 4. **AsyncTask**:Android提供的一种轻量级异步任务类,用于在后台线程执行任务并在完成时更新UI。...

    Handler实现图片播放

    本示例中的"Handler实现图片播放"是一个基础的实践,它利用了Android的消息处理机制来控制UI线程与后台线程之间的通信。Handler是Android中的一个关键组件,用于在不同线程间传递消息和执行任务。现在,我们详细探讨...

    利用Handler来更新android的UI

    `MessageQueue`负责存储待处理的消息,而`Looper`则不断地从队列中取出消息,交给相应的`Handler`处理。在`Looper`的`loop()`方法中,有一个无限循环,不断地调用`next()`方法获取并分发消息。 4. 源码分析 `...

    Android利用handler在线程之间传递代码

    通常,主线程(UI线程)中有一个默认的Looper在后台不断循环地检查Message队列,一旦发现有新消息,就会调用Handler的`handleMessage()`方法来处理这些消息。这样,我们就可以在子线程中生成Message,通过Handler将...

    Android Handler定时更新UI

    在Android应用开发中,Handler是实现线程间通信的关键组件,尤其在涉及到UI更新时,它的作用尤为重要。本文将深入探讨“Android Handler定时更新UI”的相关知识点,以及如何使用CounterDemo来实现这一功能。 首先,...

    ViewPager和Handler结合使用实现轮播图

    Handler是Android中处理消息和线程通信的关键工具,它可以在主线程中更新UI,避免了线程同步的问题。通常,我们会创建一个Runnable对象,在其run()方法中改变ViewPager的当前页,并通过postDelayed()将其重新放入...

Global site tag (gtag.js) - Google Analytics