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.关于线程休眠问题 对线程 ...
随机推荐
- JSPt的Base标签
<base href="${pageContext.request.contextPath}/"/> 注意:base标签得到的内容是: /projectName/ 这种 ...
- Centos6.8 Mysql5.6 安装配置教程
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS ...
- kickstart2019 round_A B. Parcels
思路: 利用了曼哈顿距离和切比雪夫距离之间的转化. 参考: https://blog.csdn.net/Dylan_Frank/article/details/88985444 https://www ...
- windows下 php集成环境如何通过cmd执行命令
---恢复内容开始--- php学习过程中 Windows环境下的php集成程序很多 这样方便了学习 但是在熟悉命令使用方面可以说是十分不便 本文将从两个方便 向大家介绍如何快速通过cmd命令实现命令 ...
- redis空间键详解
前言 redis的空间键通知是在2.8.0版本以后加入的,客户端通过发布订阅的方式,订阅某个频道,接收通过某种方式影响redis中数据的事件. 目录: 1.空间键事件分类 2.如何启用redis的空间 ...
- 【Android开发笔记】生命周期研究
启动 onCreate onStart onResume 退出键 onPause onStop onDestroy 锁屏 & 按住 home键 & 被其他Activity覆盖(Sing ...
- JavaScript基础:(加号,数值转换,布尔转换)
JavaScript中加号运算符"+" 运算过程理解 1) 如果其中一个操作数是对象,则对象会遵循对象到原始值的转换规则转换为原始值.日期对象通过toString()方法执行转换, ...
- Mysql数据库学习总结(一)
数据库概念 数据库(Database)是按照数据结构来组织.存储和管理数据,建立在计算机存储设备上的仓库. 简单说,数据库就是存放数据的仓库.和图书馆存放书籍.粮仓存放粮食类似. 数据库分类 分为 关 ...
- [Asp.Net] Form验证中 user.identity为false
这个方法可以是user.identity设置为true FormsAuthentication.SetAuthCookie(Username, true); 但是要开启form验证, 在配置文件中 & ...
- POJ 3280 Cheapest Palindrome(区间dp)
dp[i][j]表示处理完i到j的花费,如果s[i] == s[j] 则不需要处理,否则处理s[i]或s[j], 对一个字符ch,加上ch或删掉ch对区间转移来说效果是一样的,两者取min. #inc ...