zoukankan      html  css  js  c++  java
  • 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

    既然选择了,便不顾风雨兼程。Just follow yourself.
  • 相关阅读:
    Linux系统下/tmp目录文件重启后自动删除,不重启自动删除10天前的/TMP的文件(转)
    Docker 镜像加速器
    RabbitMQ集群和高可用配置
    k8s如何管理Pod(rc、rs、deployment)
    微信开放平台开发(1) 语义理解
    微信开放平台开发(2) 微信登录
    微信电话
    微信支付开发(1) 微信支付URL配置
    微信支付开发(2) 微信支付账号体系
    微信支付开发(3) JS API支付
  • 原文地址:https://www.cnblogs.com/Jason-Jan/p/7158431.html
Copyright © 2011-2022 走看看