- 浏览: 741625 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (439)
- 生活小感 (9)
- Java (65)
- 笔面经 (18)
- 算法 (45)
- 读书笔记 (1)
- Android (147)
- 设计模式 (7)
- C语言 (7)
- 职业生涯 (6)
- 网络 (5)
- 数据库 (3)
- Linux/Unix (21)
- C++ (7)
- 思考 (3)
- WinPhone (4)
- Git (6)
- http (1)
- UML (1)
- SQL (2)
- Ant (1)
- iOS (14)
- FFmpeg (22)
- WebRTC (10)
- Mac (2)
- web (0)
- TCP (2)
- Vim (2)
- OpenSSL (1)
- OpenGL (6)
- 多媒体 (10)
- cocos2d (2)
- svn (1)
最新评论
-
wahahachuang8:
我觉得这种东西自己开发太麻烦了,就别自己捣鼓了,找个第三方,方 ...
WebSocket初探【转】 -
ding335306:
这个目录下没有找到此文件
eclipse.ini in MAC -
songshuaiyang:
哥们写东西可真乱啊
Android获取cpu和内存信息、网址的代码 -
zhoutao_temp:
这是自己能看懂还是让别人能看得懂,您就不能把版面稍微整理一下吗 ...
FFMPEG源码分析 -
chriszeng87:
string2020 写道git clone --bare表示 ...
复制git库
Handler的定义:
主要接受子线程发送的数据, 并用此数据配合主线程更新UI。当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发。
比如说,你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,会收到Android系统的一个错误提示 "强制关闭"。
这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,Android主线程是线程不安全的,也就是说,更新UI只能在主线程中更新,子线程中操作是危险的。这个时候,Handler就出现了,来解决这个复杂的问题 ,由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象(里面包含数据),把这些消息放入主线程队列中,配合主线程进行更新UI。
andriod提供了 Handler 和 Looper 来满足线程间的通信。为了研究其中线程机制的问题,写了2个demo:
Demo1:
- package com.mp;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- public class MyThread extends Activity {
- private Handler handler = new Handler();
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- handler.post(new MyRunnable());
- System.out.println("Oncreate---The Thread id is :"
- + Thread.currentThread().getId());
- setContentView(R.layout.main);
- }
- private class MyRunnable implements Runnable {
- public void run() {
- System.out.println("Runnable---The Thread is running");
- System.out.println("Runnable---The Thread id is :"
- + Thread.currentThread().getId());
- try {
- Thread.sleep(6000);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }
在这个demo中,整个过程如下:
程序已启动,就把MyRunnable加入到消息队列中,android的handler是异步机制,所以在handler.post(new MyRunnable()); 之后,程序会继续执行,所以以后的语句会继续,这时候我们输出Oncreate中的当前线程ID。同时MyRunnable的run方法也在运行,一样输出run方法中的当前线程ID,然后让线程休眠6秒。
demo的结果分析:
1:控制台的输出: Oncreate---The Thread id is :1
Runnable---The Thread is running
Runnable---The Thread id is :1
2:程序启动后6秒,我们才看到main.xml中的内容(只有一个textview)
这2个结果都表明handler和主线程是同一个线程。如果这时候你做的是一个耗时的操作(比如下载),那么这样是不可行的。
于是,android给我们提供了Looper这样一个类。其实Android中每一个Thread都跟着一个Looper,Looper可以帮助Thread维护一个消息队列.
Demo2:
- package com.mp;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.HandlerThread;
- public class MyThread2 extends Activity {
- private Handler handler = null;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- HandlerThread handlerThread = new HandlerThread("myHandlerThread");
- handlerThread.start();
- handler = new Handler(handlerThread.getLooper());
- handler.post(new MyRunnable());
- System.out.println("Oncreate---The Thread id is :"
- + Thread.currentThread().getId());
- setContentView(R.layout.main);
- }
- private class MyRunnable implements Runnable {
- public void run() {
- System.out.println("Runnable---The Thread is running");
- System.out.println("Runnable---The Thread id is :"
- + Thread.currentThread().getId());
- try {
- Thread.sleep(6000);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }
在这个demo中,用到了HandlerThread,在HandlerThread对象中可以通过getLooper方法获取一个Looper对象控制句柄,我们可以将其这个Looper对象映射到一个Handler中去来实现一个线程同步机制。于是就有以下结果;
1:控制台的输出: Oncreate---The Thread id is :1
Runnable---The Thread is running
Runnable---The Thread id is :10
2:程序启动后,我们立刻看到main.xml中的内容。
这样就达到了多线程的结果。
发表评论
-
清除android程序中的多余资源
2015-09-11 16:15 1016转自:http://blog.csdn.net/rivera ... -
Android Https相关完全解析 当OkHttp遇到Https
2015-08-31 12:38 1506转自: http://blog.csdn.net/lmj ... -
Android任务和返回栈完全解析,细数那些你所不知道的细节
2015-08-20 19:48 813转自:http://blog.csdn.net/ ... -
android bitmap compress(图片压缩)
2015-08-20 16:08 1390转自:http://blog.csdn.net/luhuaj ... -
Android事件分发机制完全解析,带你从源码的角度彻底理解
2015-08-14 10:45 1130其实我一直准备写一篇关于Android事件分发机制的文章,从 ... -
Android利用Fiddler进行网络数据抓包
2015-07-14 18:07 884转自Trinea的博客: http://www.trin ... -
Android版本和API Level对应关系
2015-07-09 16:13 943Android 5.1 22 LOLLIPOP_MR1 ... -
Android 5.0(Lollipop)中的SurfaceTexture,TextureView, SurfaceView和GLSurfaceView
2015-06-12 11:53 6480SurfaceView, GLSurfaceView, Su ... -
【Android】使用dex2jar 与JD-Gui 反编译APK文件,查看源代码
2015-06-03 14:22 1158使用dex2jar和JD-GUI这2个工具配合反编译APK文 ... -
实现一个Android输入法
2015-03-30 17:47 7284原文来自Android Developer Guide, ... -
显示gsensor即时数据的apk && 用gsensor来判断手机的静和动
2014-11-25 12:07 5269即时显示gsensor的数据,可以在调试重力感应器驱动和测试 ... -
Android中的人脸检测(静态和动态)
2014-11-25 12:06 3376(1)背景。 Google 于2006年8月 ... -
Android ART机制分析
2014-11-22 11:15 1197一、Android系统性能提升之路 Dalvik虚拟 ... -
mac 无法连接android手机进行调试 解决方案
2014-11-15 11:11 2814第一步: 查看usb设备信息 在 终端输入:system_ ... -
android ndk环境配置(包括CDT环境设置)
2014-11-12 10:46 2394一、关于NDKAndroid NDK ... -
daemon not running. starting it now on port 5037 ADB server didn't ACK的解决办法
2014-11-03 11:41 57911.在cmd下 输入下面的命令查询哪个占用了5037端口 ... -
谈谈Android中的SurfaceTexture
2014-10-31 10:37 3380SurfaceTexture是从Androi ... -
如何高效地输出iOS和Android标注和切图
2014-10-26 16:00 910转自:http://www.zcool.com. ... -
Android中Thread、Handler、Looper、MessageQueue的原理分析
2014-10-21 18:14 1136在Android开发当中,Thread、Handler、Lo ... -
Java中System.loadLibrary() 的执行过程
2014-10-10 11:45 6183转自:http://my.oschina.net/wolfc ...
相关推荐
通过分析这个`demo`,开发者可以更好地理解Android中的多线程通信机制,并学会在自己的项目中正确、有效地使用`Handler`、`Looper`进行线程间通信。这将有助于提高程序的响应性和用户体验,避免因UI操作不在主线程...
本文将深入探讨Android多线程的相关知识点,基于“android多线程demo(很清晰很详细)”的描述,我们将围绕这个示例进行讲解。 1. **线程基础**: - **主线程**:Android应用的UI线程,负责处理用户交互和更新界面。...
在Android开发中,`Handler`、`Message`和`Looper`是实现线程间通信的重要机制,...通过熟练掌握`Handler`、`Message`和`Looper`的工作原理,开发者可以更好地控制应用程序的多线程行为,提升程序的响应性和用户体验。
这个"android多线程下载demo"展示了如何利用多线程分段下载一个APK文件,同时实现实时更新UI展示下载进度,并在下载完成后自动跳转到应用安装界面。以下是对这个Demo涉及知识点的详细解释: 1. **多线程下载**:多...
此时,Android提供了多种多线程解决方案,其中之一就是Handler机制。本篇将详细讲解如何在Android中使用Handler进行线程间通信。 Handler是Android中处理消息和回调的核心组件,它与Looper和Message紧密配合,实现...
总结来说,Handler机制是Android多线程编程的关键工具之一,它使得开发者能够方便地在线程间传递信息,实现异步处理,确保UI线程不被阻塞,提升用户体验。熟练掌握Handler的使用,对任何Android开发者都至关重要。
在Android应用开发中,多线程是至关重要的技术,它能帮助我们实现应用程序的高效运行,提高用户体验。本文将深入探讨Android多线程的使用,包括其原理、常见方法以及如何通过实例进行实践。 首先,我们需要理解...
Android提供了Handler、Looper、ThreadPoolExecutor等工具来实现多线程。在这个demo中,可能使用了ThreadPoolExecutor,它允许开发者更灵活地控制线程的数量和行为。 在多线程下载过程中,我们需要跟踪每个线程的...
本文将基于提供的标题“Android 多线程下载简单demo之Thread”和描述,深入讲解如何实现一个简单的多线程下载功能。这个示例来源于一个CSDN博客,通过访问提供的链接...
这个demo介绍了通过Handler在线程之间传递消息,demo中一个三个线程,主线程,发送消息的分线程,接收消息的分线程。发送消息的分线程会通知主线程更改标签文字,同时会通知接收消息的分线程更改进度条的进度。
而Handler永远都是在UI主线程,这就意味着对一个控件的修改永远只会有一个线程,不会存在多个线程同时修改一个控件。二是方便统一管理,通过Handler可以统一进行对UI的管理,因为Handler采用消息处理的机制。就是另...
本项目“Android源代码:HandlerDemo”将深入探讨`Handler`机制及其在多线程环境中的应用。 `Handler`、`Looper`和`Message`是Android消息传递模型的三个核心组件。首先,`Looper`是消息循环,它不断地从消息队列中...
本文将深入探讨Android中的线程及其应用,基于提供的"Android开发(个人整理01) 线程Demo源码"进行讲解。 1. **主线程(UI线程)** Android应用程序的默认执行线程被称为主线程,它负责处理用户交互和UI更新。...
本示例"android 多线程下载 demo"提供了一个具体的实现,通过代码注释帮助理解多线程在Android中的应用。 多线程是解决CPU密集型任务或I/O操作时提高程序性能的有效手段。在Android系统中,主线程(UI线程)负责...
在Android开发中,多线程处理是至关重要的,特别是在UI更新和后台任务执行时。`Handler`、`Message`和`Looper`是Android系统提供的一个关键机制,用于在不同的线程间进行通信,特别是主线程(UI线程)与工作线程间的...
这个"android 多线程下载器demo"提供了一个易于集成的解决方案,允许开发者轻松地暂停、继续下载,并可自定义下载线程数量以及设置存储路径。 首先,我们来详细了解一下多线程下载的工作原理。传统的单线程下载方式...
这个"Android 多线程下载的Demo"旨在演示如何在Android应用中实现这一功能,并实时更新进度条来显示下载进度。下面我们将深入探讨相关知识点。 1. **线程与进程**:在Android系统中,每个应用程序都有一个独立的...
在Android开发中,多线程断点下载以及进度实时更新是一项重要的技术,它涉及到网络编程、文件操作和UI更新等多个方面。以下是对这个主题的详细解释: **多线程下载**: 多线程下载是为了提高文件下载速度和效率。...
在Android开发中,多线程是提升应用性能和用户体验的重要手段。然而,如果没有正确地管理线程,可能会引发数据竞争、死锁等问题,这正是线程同步所关注的重点。线程同步是为了确保多个线程在访问共享资源时能按照...