- 浏览: 718137 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 960转自:http://blog.csdn.net/rivera ... -
Android Https相关完全解析 当OkHttp遇到Https
2015-08-31 12:38 1462转自: http://blog.csdn.net/lmj ... -
Android任务和返回栈完全解析,细数那些你所不知道的细节
2015-08-20 19:48 763转自:http://blog.csdn.net/ ... -
android bitmap compress(图片压缩)
2015-08-20 16:08 1298转自:http://blog.csdn.net/luhuaj ... -
Android事件分发机制完全解析,带你从源码的角度彻底理解
2015-08-14 10:45 1060其实我一直准备写一篇关于Android事件分发机制的文章,从 ... -
Android利用Fiddler进行网络数据抓包
2015-07-14 18:07 835转自Trinea的博客: http://www.trin ... -
Android版本和API Level对应关系
2015-07-09 16:13 866Android 5.1 22 LOLLIPOP_MR1 ... -
Android 5.0(Lollipop)中的SurfaceTexture,TextureView, SurfaceView和GLSurfaceView
2015-06-12 11:53 6434SurfaceView, GLSurfaceView, Su ... -
【Android】使用dex2jar 与JD-Gui 反编译APK文件,查看源代码
2015-06-03 14:22 1081使用dex2jar和JD-GUI这2个工具配合反编译APK文 ... -
实现一个Android输入法
2015-03-30 17:47 7227原文来自Android Developer Guide, ... -
显示gsensor即时数据的apk && 用gsensor来判断手机的静和动
2014-11-25 12:07 5134即时显示gsensor的数据,可以在调试重力感应器驱动和测试 ... -
Android中的人脸检测(静态和动态)
2014-11-25 12:06 3316(1)背景。 Google 于2006年8月 ... -
Android ART机制分析
2014-11-22 11:15 1117一、Android系统性能提升之路 Dalvik虚拟 ... -
mac 无法连接android手机进行调试 解决方案
2014-11-15 11:11 2722第一步: 查看usb设备信息 在 终端输入:system_ ... -
android ndk环境配置(包括CDT环境设置)
2014-11-12 10:46 2344一、关于NDKAndroid NDK ... -
daemon not running. starting it now on port 5037 ADB server didn't ACK的解决办法
2014-11-03 11:41 56861.在cmd下 输入下面的命令查询哪个占用了5037端口 ... -
谈谈Android中的SurfaceTexture
2014-10-31 10:37 3332SurfaceTexture是从Androi ... -
如何高效地输出iOS和Android标注和切图
2014-10-26 16:00 865转自:http://www.zcool.com. ... -
Android中Thread、Handler、Looper、MessageQueue的原理分析
2014-10-21 18:14 1084在Android开发当中,Thread、Handler、Lo ... -
Java中System.loadLibrary() 的执行过程
2014-10-10 11:45 6064转自:http://my.oschina.net/wolfc ...
相关推荐
这个demo介绍了通过Handler在线程之间传递消息,demo中一个三个线程,主线程,发送消息的分线程,接收消息的分线程。发送消息的分线程会通知主线程更改标签文字,同时会通知接收消息的分线程更改进度条的进度。
而Handler永远都是在UI主线程,这就意味着对一个控件的修改永远只会有一个线程,不会存在多个线程同时修改一个控件。二是方便统一管理,通过Handler可以统一进行对UI的管理,因为Handler采用消息处理的机制。就是另...
Android–多线程之Handler 前言 Android的消息传递机制是另外一种形式的“事件处理”,这种机制主要是为了解决Android应用中多线程的问题,在Android中不 允许Activity新启动的线程访问该Activity里的UI组件,...
Handler+thread 加载网络图片,是个学习android多线程好Demo
1.多线程更新Ui会导致UI界面错乱 2.如果加锁会导致性能下降 3.只在主线程去更新UI,轮询处理 Handler使用简介 其实关键方法就2个一个sendMessage,用来接收消息 另一个是handleMessage,用来处理接收到的消息 下面...
下面的程序Demo是实现一个简单的C/S聊天室的应用,每个客户端该包含两条线程:一条负责生成主界面,响应用户动作,并将用户输入的数据写入Socket对应的输出流中;另一条负责读取Socket对应的输入流中的数据(从...
以及多个子线程(也叫Worker线程)。 在android中有一个规则:考虑到安全性,子线程不能动态的改变主线程中组件的属性值。 但为了执行一些耗时操作,往往会将它们放在子线程中,执行完毕要更新主线程中的UI,所以就有...
用一个随机数模拟的下载速度,用一个Button可以获取所有下载任务的进度,如果想做显示,即可做一个线程循环调用这个Button所做的处理,用Handler更新即可!
//内部实现多线程机制,以回调函数的方式返回 ajaxHandler.post(map, new OnAjaxListener() { //访问出错AjaxError.type 为错误编号 @Override public void Error(AjaxError arg0) { } //开始访问 @Override ...
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能...
最近不是太忙,花了一些...使用到的技术点包括ListView,自定义ListAdapter,多线程相关的Message,Handler,验证相关的OAuth,用户图片的异步加载。 新浪微博的验证使用的是signpost的OAuth组件,没有使用微博的SDK。
各位父老乡亲,我单汉三又回来了,今天为大家带来一个用原生的安卓写的多线程断点下载Demo。 通过本文你可以学习到: SQLite的基本使用,数据库的增删改查。 Handler的消息处理与更新UI。 Service(主要用于下载...
但是在android的学习中,经常会在一些demo中看到Handler与Message的一些使用,所以Handler与Message的学习也是有必要了。至于学多少,笔者还是比较坚持自己的看法,“用多少,学多少”,毕竟已经有了AsyncTask如此...
在 Android 系统中UI操作并不是线程安全的,如果多个线程并发的去操作同一个组件,可能导致线程安全问题。 为了解决这一个问题,Android 制定了一条规则: 只允许 UI 线程来修改 UI 组件的属性等,也就是说必须单...
android页面启动时,先启动预加载,等界面布局初始化完成后,再取出预加载的结果进行展示。 主要利用到Handler机制中的SyncBarrier特性来实现Message阻滞
4.17 后台程序运行进度提示——ProgressBar与Handler的整合应用 4.18 动态文字排版——GridView与ArrayAdapter设计 4.19 在Activity里显示列表列表——ListView的布局 4.20 以动态列表配置选项——ListActivity与...
Asynctask作为Android的基础之一,怎么使用就不多讲解了,网上到处都是教程,建议查看Android官方API文档:https://developer.android.google.cn/reference/android/os/AsyncTask.html 这里只实现一个小Demo程序,供...
Android 学习文档总结 ................... 1 DevDiv 推荐资源 ........................ 2 Windows 8 ........................................................... 2 iOS .........................................
这个类允许执行后台操作并在UI界面上发布结果,而不必处理多线程。AsyncTask是围绕Thread和Handler设计的一个辅助类,它不构成一个通用的线程框架。Asynctasks应该用于短作业(最多几秒钟)。 说的简单一点,其实...