前言:前面写的线程简直是一坨废物,到现在依然一头雾水,真是一点点都没领悟,于是又打算下一番功夫了,必须要学好线程,不然今后也是一坨废物。

  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 线程那些事儿的更多相关文章

  1. Android线程管理之ThreadLocal理解及应用场景

    前言: 最近在学习总结Android的动画效果,当学到Android属性动画的时候大致看了下源代码,里面的AnimationHandler存取使用了ThreadLocal,激起了我很大的好奇心以及兴趣 ...

  2. Android线程管理之Thread使用总结

    前言 最近在一直准备总结一下Android上的线程管理,今天先来总结一下Thread使用. 线程管理相关文章地址: Android线程管理之Thread使用总结 Android线程管理之Executo ...

  3. Android线程管理之ExecutorService线程池

    前言: 上篇学习了线程Thread的使用,今天来学习一下线程池ExecutorService. 线程管理相关文章地址: Android线程管理之Thread使用总结 Android线程管理之Execu ...

  4. Android线程管理之ThreadPoolExecutor自定义线程池

    前言: 上篇主要介绍了使用线程池的好处以及ExecutorService接口,然后学习了通过Executors工厂类生成满足不同需求的简单线程池,但是有时候我们需要相对复杂的线程池的时候就需要我们自己 ...

  5. Android线程管理之AsyncTask异步任务

    前言: 前面几篇文章主要学习了线程以及线程池的创建与使用,今天来学习一下AsyncTask异步任务,学习下AsyncTask到底解决了什么问题?然而它有什么弊端?正所谓知己知彼百战百胜嘛! 线程管理相 ...

  6. Android线程之主线程向子线程发送消息

    和大家一起探讨Android线程已经有些日子了,谈的最多的就是如何把子线程中的数据发送给主线程进行处理,进行UI界面的更新,为什么要这样,请查阅之前的随笔.本篇我们就来讨论一下关于主线程向子线程如何发 ...

  7. Android线程管理(三)——Thread类的内部原理、休眠及唤醒

    线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...

  8. Android线程管理(二)——ActivityThread

    线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...

  9. android 线程学习

    很多人觉得线程难理解,主要有两个问题: 线程休眠,既然线程已经休眠了,程序的运行速度还能提高吗? 线程体一般都进行死循环,既然线程死循环,程序就应该死掉了,就会没有反应. 1.关于线程休眠问题 对线程 ...

随机推荐

  1. C#与JAVA学习感悟

    C#与JAVA学习感悟 学完C#与JAVA,感觉收获良多.C#与JAVA这两门语言相似度很高(了解它们早期历史的人可能知道为什么),也许很多人在学习JAVA(或C#)时会同时学习C#(或JAVA),因 ...

  2. 项目开发bug记录

    项目开发中遇到了一个问题,类中出现未知属性 ‘ $jacocoData ’,准确的来说,实际上在集成测试阶段,系统自动运行测试用例时,抛出来的异常提示信息,但是在开发阶段是不存在的.这个问题是以前没有 ...

  3. linux启动mysql报错 Starting MySQL... ERROR! The server quit without updating PID file (XXXX pid文件位置)

    最近在云服务器上安装mysql  启动时报错了,从错误中可以看出,定位在pid文件上,有三种解决方案 1.重启服务器:因为服务器更新时,可能会禁用某些守护进程,重启后即可恢复 2.删除配置文件,重启试 ...

  4. Counting blessings can actually increase happiness and health by reminding us of the good things in life.

    Counting blessings can actually increase happiness and health by reminding us of the good things in ...

  5. 使用腾讯IP分享计划网站中的纯JS省市区三级联动

    JS地址:http://ip.qq.com/js/geo.js 实例如下: <!DOCTYPE html> <html> <head> <title>省 ...

  6. 金庸和古龙,Netweaver和微服务,以及SAP Hybris Revenue Cloud

    这周Jerry在长沙客户现场待了几天,感谢易总和彩亮的款待.终于有机会和关注这个公众号的一些CRM顾问们进行线下互动,感觉很不错.得知公众号里某些文章帮助顾问们解决了一些工作中的实际问题,我很高兴.感 ...

  7. VMware安装win7系统

    1.创建一个虚拟机 2.配置iso映射文件   3.设置boot设置第一启动为cd   4.快速分区后重启电脑,然后选择[A]安装win7.  重启电脑后安装win7系统   搞定...  

  8. OpenLayers项目分析——(一)项目介绍

    OpenLayers 是由MetaCarta公司开发的,用于WebGIS客户端的JavaScript包,目前的最高版本是2.7 V,通过BSD License 发行.它实现访问地理空间数据的方法都符合 ...

  9. 【洛谷4252】[NOI2006] 聪明的导游(提答题)

    点此看题面 大致题意: 给你一张\(n\)个点.\(m\)条边的无向图,让你找出图上的一条不经过重复节点的最长路(提答+\(spj\)). 随机化乱搞 针对这种提答题,我们就要用随机化乱搞(Cptra ...

  10. cf1151 B

    题目连接 : https://codeforces.com/contest/1151/problem/B 可能我想法有问题,我怎么感觉B题的思路不直接想出来的,我想了一会才想出来,感觉不难,但可能有更 ...