当前位置: 首页 > news >正文

天津企业建网站Wordpress税表

天津企业建网站,Wordpress税表,男女做羞羞事网站,wordpress公司企业版权声明#xff1a;本文为博主原创文章#xff0c;转载请注明出处http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/51355051 Android 提供了Handler和Looper来来满足线程间的通信#xff0c;而前面我们所说的IPC指的是进程间的通信。… 版权声明本文为博主原创文章转载请注明出处http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/51355051 Android 提供了Handler和Looper来来满足线程间的通信而前面我们所说的IPC指的是进程间的通信。这是两个完全不同的概念。大家不要搞混了。 Handler先进先出原则Looper类用来管理特定线程内消息的交换MessageExchange 我们了解Handler之前首先要知晓一下几点 Looper一个线程有一个Looper由Looper来管理当前线程的MessageQueue消息队列就是无限将消息队列里的取出一个Handler必须绑定一个Looper。HandlerHandler的主要作用是将某一任务切换到特定的线程来执行。为什么要有这个机制昵接下来会为大家介绍MessageQueueu消息队列用来存放线程发出的消息。Tread线程通常是指UI线程也就是主线程每个线程创建时都会为其创建MessageQueue。1、为什么会有Handler机制 我们刚说Handler机制的主要作用是将某一任务切换到特定的线程来执行我们做项目可能都遇到过ANRApplication Not Response这就是因为执行某项任务的时间太长而导致程序无法响应。这种情况我们就需要将这项耗时较长的任务移到子线程来执行从而消除ANR。而我们都知道Android规定访问UI只能在主线程中进行如果在子线程中访问UI那么程序就会抛出异常。而Android提供Handler就是为了解决在子线程中无法访问UI的矛盾。 2、demo 我们来先看一个简单的Demo吧 MainActivity.java package com.example.terry.hanlderdemo;import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.widget.TextView; /*** Demo描述:** 示例步骤如下:* 1 子线程给子线程本身发送消息* 2 收到1的消息后,子线程给主线程发送消息* 3 收到2的消息后,主线程给子线程发送消息** 为实现子线程给自己本身发送消息,关键还是在于构造Handler时传入的Looper.* 在此就传入该子线程自己的Looper即调用Looper.myLooper(),代码如下:* Looper.prepare();* mHandlerTest1new HandlerTest1(Looper.myLooper());* Looper.loop();** 所以当mHandlerTest1.sendMessage(message);发送消息时* 当然是发送到了它自己的消息队列.** 当子线程中收到自己发送的消息后,可继续发送消息到主线程.此时只要注意构造* Handler时传入的Handler是主线程的Handler即可,即getMainLooper().* 其余没啥可说的.*** 在主线程处理消息后再发消息到子线程*** 其实这些线程间发送消息,没有什么;关键还是在于构造Handler时传入谁的Looper.**/ public class MainActivity extends Activity {private TextView mTextView;private HandlerTest1 mHandlerTest1;private HandlerTest2 mHandlerTest2;private int counter0;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();}private void init() {mTextView (TextView) findViewById(R.id.textView);//1 子线程发送消息给本身new Thread() {public void run() {Looper.prepare();mHandlerTest1new HandlerTest1(Looper.myLooper());Message message new Message();message.obj 子线程发送的消息Hi~Hi;mHandlerTest1.sendMessage(message);Looper.loop();}}.start();}private class HandlerTest1 extends Handler {private HandlerTest1(Looper looper) {super(looper);}Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);System.out.println(子线程收到: msg.obj);//2 收到消息后可再发消息到主线程mHandlerTest2new HandlerTest2(getMainLooper());Message message new Message();message.obj O(∩_∩)O;mHandlerTest2.sendMessage(message);}}private class HandlerTest2 extends Handler {private HandlerTest2(Looper looper) {super(looper);}Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);mTextView.setText(在主线程中,收到子线程发来消息: msg.obj);//3 收到消息后再发消息到子线程if (counter0) {Message message new Message();message.obj 主线程发送的消息Xi~Xi;mHandlerTest1.sendMessage(message);counter;}}}}3、Android 消息机制分析 3.1 TreadLocal的工作原理 TreadLocal 是一个线程内部的数据存储类通过它可以在指定的线程中存储数据数据存储以后只有在特定的线程中可以获取到存储的数据对于其他线程来说则无法获取到。ThreadLocal用一句大白话来讲解就是看上去只new了一份但在每个不同的线程中却可以拥有不同数据副本的神奇类。其本质是ThreadLocal中的Values类维护了一个Object[]而每个Thread类中有一个ThreadLocal.Values成员当调用ThreadLocal的set方法时其实是根据一定规则把这个线程中对应的ThreadLocal值塞进了Values的Object[]数组中的某个index里。这个index总是为ThreadLocal的reference字段所标识的对象的下一个位置。 3.2  MessageQueue的工作原理 MessageQueue的工作原理主要方法为enqueueMessage和next。   a. enqueueMessag主要就是一个单链表的插入操作   b. next方法是一个无限循环如果消息队列中没有消息next方法就阻塞有新消息到来时next方法会返回这条消息并将其从单链表中删除。 3.3  Looper的工作原理  a. prepare方法为当前没有Looper的线程创建Looper。 b. prepareMainLooper和getMainLooper方法用于创建和获取ActivityThread的Looper。 c. quit和quitSafely方法前者立即退出后者只是设定一个标记当消息队列中的所有消息处理完毕后会才安全退出。子线程中创建的Looper建议不需要的时候都要手动终止。 d. loop方法死循环阻塞获取msg并丢给msg.target.dispatchMessage方法去处理这里的target就是handler。 3.4Handler的工作原理 a. 无论sendMessage还是post最终都是调用的sendMessageAtTime方法。 b. 发送消息其实就是把一条消息通过MessageQueue的enqueueMessage方法加入消息队列Looper收到消息就会调用handler的dispatchMessage方法。它的处理过程参考流程图一看就懂  c. 这里我补充一个东西当我们直接Handler h new Handler()时本质调用的是Handler(Callback callback, Boolean async)构造方法这个方法里会调用Looper.myLooper()方法这个方法其实就是返回的ThreadLocal里保存的当前线程的Looper这也就解释了为什么我们在主线程中这样new没有问题子线程中如果不先Looper.prepare会抛出异常的原因前面多次说了因为ActivityThread会在初始化的时候创建自己的Looper。 3.5主线程的消息循环
http://www.zqtcl.cn/news/350097/

相关文章:

  • php项目网站建设方案书专做药材的网站有哪些
  • 网站表单模板营销型网站建设的5大技巧
  • html手机版网站网站备案后怎么做实名认证
  • 第五冶金建设公司职工大学网站大连工业
  • 网站的基础服务html网站地图生成器
  • 网站开发学徒工作如何设计师培训哪家好
  • 做网站多少钱西宁君博正规株洲在线论坛招聘求职
  • 抚州营销型网站建设殡葬类网站建设
  • 公司网站制作汇报会合肥品牌设计
  • 网站推广策划书怎么说网站建设公司中企动力强
  • php网站源码架构阿里巴巴运营技巧
  • 如何帮助网站吸引流量宁波市网站集约化建设通知
  • 从域名角度看网站建设注意事项河北邯郸seo网站建设网站优化
  • 网站推广策划评估工具7wordpress菜单新连接
  • 网站创建asp电影网站源码
  • 大朗网站建设培训淘宝客cms网站建设
  • 广西建设厅网站在线服务徐州设计网站
  • 重庆营销型网站建设价格网站网站做代理赚钱吗
  • 专门帮做ppt的网站吗网络营销推广的主要特点
  • 烟台做外贸网站店面装修设计图片
  • 广州o2o网站建设餐饮网站建设案例
  • 潜山网站建设抖音代运营报价单
  • 网站建设与推广话术邢台信息港聊天室
  • 获取网页 代码 做网站有哪些网站软件可以做网站的原型
  • 招聘去建设网站类网站东莞今天新增加的情况
  • 烟台网站制作软件互联网创业做什么好
  • 网站建设有名的公司办公室装修实景拍摄图
  • 专业做卖菜的网站网站备案不通过
  • 西安长安区建设局网站网站漂浮广告
  • 顺的网站建设信息东莞建筑建设网站建设