Android 线程那些事儿
前言:前面写的线程简直是一坨废物,到现在依然一头雾水,真是一点点都没领悟,于是又打算下一番功夫了,必须要学好线程,不然今后也是一坨废物。
1.理解了一点调试时,到线程阶段总是报错的一个原因,就是系统会自动为主线程创建一个Looper对象,开启消息循环。然而在子线程创建Handler对象,将会产生异常信息,一直折磨人,真是痛苦。
2.当然了,子线程也是可以创建一个handler的,不过有点小麻烦。要用到Looper.prepare()和Looper.loop()这两个关键的方法。
3.今天用了一个超好用的子线程传到主线程数据的方法。前几天被handler坑惨了,调试的时候疯狂报错,不知道为什么只要碰到线程,然后执行下一步,然后安卓君就很恼怒一样,直接闪退。后来发现是message那边没有设置好,一直用obtainMessage线程池,虽然机制很好,但是只是简单的抄袭,原理什么的也没有理解清楚,后来好像是msg.what每次从0开始设置就可以了。
4.今天,遇到一个难题。想在全局定义一个boolean类型的数据,在子线程中请求http,然后在子线程中修改全局变量,一开始我还是想用老办法,用handler.sendEmptyMessage,可是啊,调试的时候执行的流程乱跑,真的抓不着头脑,要么报错,要么就跳过去了。觉得这样并不是解决问题的办法,我没有用到UI啊,我凭什么要用一个handler.sendMessage什么的然后在返回去执行UI主进程啊,这样不是把问题复杂化了。
5.sendEmptyMessage方式的缺点主要有两个,一个是不方便调试,第二是思路很混乱,有时候你只要在子线程中得到数据就ok了,所以完全可以抛弃掉以前的obtainMessage之类的东西。直接用handler.post(new Runnable(){...})直接在这里面处理自己的逻辑就行了。
6.这里主要说一下消息处理类的基础,所有的东西都基本按照这些基础来衍生的,Handler类提供的方法有handleMessage(Message)-----处理消息的方法。通常重写该方法来处理消息,在发送消息时,该方法会自动回调。 post(Runnable)-----立即发送Runnale对象,该Runnale对象最后将被封装成Message对象,这种方式我是最喜欢的,因为方便快捷啊。 postAtTime(Runnable,long)-----定时发送Runable对象,该Runnable对象最后将被封装成Message对象。 postDelayed(Runnable,long)延迟发送Runnable对象,该Runnable最后将被封装成Message对象。
7.然后就行一些我比较讨厌的函数了,毕竟被它们折磨了好久,痛不欲生。sendEmptyMessage(int)-----发送空消息。 sendMessage(Message)-----立即发送消息。 sendMessageAtTime(Message,long)定时发送消息。 sendMessageDelayed(Message,long)-----延迟发送消息。感觉上和post类似,稍微比post复杂一点,不过这东西也相当重要,以后还是要多学学的。
8.最后来谈一谈消息类的简介-----Message
顾名思义,Message就是消息,里面肯定会有消息的类型,消息结果,消息对象。Message被存放在MessageQueue中,一个MessageQueue中可以包含多个Message对象。
arg1-----第一个整型 arg2-----第二个整型 obj-----Object对象用例存放发送给接收器的Object类型的任意对象。
replyTo-----Messager-----用来指定此Message发送到何处的可选Message对象,一般很少用
what-----int-----用来指定用户自定义的消息代码,这样接收者可以了解这个消息的信息。
如果不是整型的数据,Message类属性也可以携带Bundle对象,个人觉得Bundle很强大,一个键值对包容天下。
msg.what-----用来处理不同的消息,对于UI进行不同的操作就是根据这个what的值得多少决定的。
9.最后一句话,晚安memeda~2017/7/14 0:26
Android 线程那些事儿的更多相关文章
- Android线程管理之ThreadLocal理解及应用场景
前言: 最近在学习总结Android的动画效果,当学到Android属性动画的时候大致看了下源代码,里面的AnimationHandler存取使用了ThreadLocal,激起了我很大的好奇心以及兴趣 ...
- Android线程管理之Thread使用总结
前言 最近在一直准备总结一下Android上的线程管理,今天先来总结一下Thread使用. 线程管理相关文章地址: Android线程管理之Thread使用总结 Android线程管理之Executo ...
- Android线程管理之ExecutorService线程池
前言: 上篇学习了线程Thread的使用,今天来学习一下线程池ExecutorService. 线程管理相关文章地址: Android线程管理之Thread使用总结 Android线程管理之Execu ...
- Android线程管理之ThreadPoolExecutor自定义线程池
前言: 上篇主要介绍了使用线程池的好处以及ExecutorService接口,然后学习了通过Executors工厂类生成满足不同需求的简单线程池,但是有时候我们需要相对复杂的线程池的时候就需要我们自己 ...
- Android线程管理之AsyncTask异步任务
前言: 前面几篇文章主要学习了线程以及线程池的创建与使用,今天来学习一下AsyncTask异步任务,学习下AsyncTask到底解决了什么问题?然而它有什么弊端?正所谓知己知彼百战百胜嘛! 线程管理相 ...
- Android线程之主线程向子线程发送消息
和大家一起探讨Android线程已经有些日子了,谈的最多的就是如何把子线程中的数据发送给主线程进行处理,进行UI界面的更新,为什么要这样,请查阅之前的随笔.本篇我们就来讨论一下关于主线程向子线程如何发 ...
- Android线程管理(三)——Thread类的内部原理、休眠及唤醒
线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...
- Android线程管理(二)——ActivityThread
线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...
- android 线程学习
很多人觉得线程难理解,主要有两个问题: 线程休眠,既然线程已经休眠了,程序的运行速度还能提高吗? 线程体一般都进行死循环,既然线程死循环,程序就应该死掉了,就会没有反应. 1.关于线程休眠问题 对线程 ...
随机推荐
- tomcat7 开机自启动(转)
转自 http://blog.csdn.net/rainyspring4540/article/details/51861079 环境:win7 tomcat7 开机自启动: 使用管理员打开命令提示 ...
- nvcc 编译显示寄存器使用情况
NVCC Compiler 里面增加 Command line pattern中${COMMAND}后 增加选项: --ptxas-options=-v
- fish 与oh-my-fish 的安装
fish 相对于 自带的shell优势很大,最近在研究使用中. 安装教程如下: sudo apt-get install fish oh-my-fish是github上开源项目,使得fish的使用更加 ...
- Jquery里面的$(this)和this, 有什么区别
当你用的是jquery时,就用$(this),如果是JS,就用this $(this).html( $(this).html() + " BAM! "); 这个里的html()是J ...
- 报错:LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
参考原文:http://bbs.csdn.net/topics/390121452 项目>属性>配置属性>清单工具>输入和输出>嵌入清单:原来是“是”,改成“否” 如果上 ...
- HTTPS的加密流程(通俗易懂,不可错过)
为什么要有HTTPS 都说进技术的产生就是为了解决旧技术的一些弊端. HTTP具有相当优秀的一面,但是凡事有利也有弊,在HTTP进行高速通信的过程中可能产生以下几个问题: HTTP采用明文传输.明文传 ...
- HDU3954 线段树(区间更新 + 点更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3954 , 一道比较好的线段树题,值得做. 题目是NotOnlySuccess大神出的,借此题来膜拜一下 ...
- Redis单机数据库
单机数据库 ·Redis服务器的所有数据库都保存在redisServer.db数组中,而数据库的数量则由redisServer.dbnum属性保存. ·客户端通过修改目标数据库指针,让它指向redis ...
- http头部信息学习
想的每2周进行知识的总结,自己拖延症有犯了,发现自己知识库量还是太少,平时总结和发现问题还不够深,对待问题的深度也存在很多问题,但是坚持学习,总结,后面应该会有收获, 1.常见的返回码 100: 请服 ...
- Android(java)学习笔记90:TextView 添加超链接(两种实现方式)
1. TextView添加超链接: TextView添加超链接有两种方式,它们有区别于WebView: (1)方式1: LinearLayout layout = new LinearLayout(t ...