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

  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. 018.Java类加载器

    https://www.ibm.com/developerworks/cn/java/j-lo-classloader/ 类加载器(class loader) 用来加载 Java 类到 Java 虚拟 ...

  2. java.sql.SQLException: Zero date value prohibited 报错分析

    今天在使用 iReview 复习词条时,发现 review 页面始终不会跳到下一个词条,应该是前台或者后台出现 BUG 了. 查看浏览器控制台,看到 500 报错,那应该是后台的问题. 登录后台,先查 ...

  3. 属性,选择器和css

    一.属性 属性:表示事物的一些特征 属性分为标签属性和样式属性 标签属性:<img src="1.jpg" width="200px" heifht=&q ...

  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. EasyUI整理学习

    参考博客: https://www.cnblogs.com/adc8868/p/6647680.html http://www.jeasyui.com/documentation/# http://w ...

  6. PHP报错configure error Cannot find libmysqlclient under usr

    编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法 (问题产生,mysql是yum安装的,libmysqlclient* ...

  7. 实战:ADFS3.0单点登录系列-前置准备

    本文为本系列第二篇,主要分为两部分进行介绍, 一.网络拓扑 二.证书制作 还是将本系列目录贴出来,方便导航 实战:ADFS3.0单点登录系列-总览 实战:ADFS3.0单点登录系列-前置准备 实战:A ...

  8. spark集群配置细则总结

    修改目录与目录组: sudo chown -R hadoop:hadoop spark-1.6.1-bin-hadoop2.6 sudo chown -R hadoop:hadoop jdk1.8.0 ...

  9. openstack RuntimeError: Unable to create a new session key. It is likely that the cache

    [Mon Apr 15 01:02:31.654247 2019] [:error] [pid 19433:tid 139790082479872] Login successful for user ...

  10. StackOverflow之旅<1>------{去掉烦人的"!=null"判断}

    问题 为了避免空指针调用,我们经常会看到这样的语句 if (someobject != null) { someobject.doCalc(); } 最终,项目中会存在大量判空代码,多么丑陋繁冗!如何 ...