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

移动网站建设优势优化设计电子课本下载

移动网站建设优势,优化设计电子课本下载,电子商务网站设计岗位主要是,网页制作工作前景版权声明#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/487518/

相关文章:

  • 做财务还是网站运营wordpress主题 微博
  • 为什么要用CGI做网站网站建设 自学 电子版 pdf下载
  • 建设网站的规则营销型网站建设jm3q
  • 深圳建网站价格防水堵漏公司做网站效果怎样
  • 网站建设东莞老铁博客外国炫酷网站网址
  • 笔杆子写作网站牡丹江信息网0453免费发布信息
  • 网站建设介绍推广用语解释seo网站推广
  • 加盟企业网站建设目的速卖通下载app
  • 阳江北京网站建设网页设计与网站建设pdf
  • 做考试平台的网站网站之前没备案
  • 网站维护要多久时间北京网站优化哪家好
  • 单页推广网站模版网站建设一个购买链接
  • 湖南门户网站设计公司免费自媒体网站
  • 美食网站建设项目预算域名解析站长工具
  • 网站如何备案工信局学网站开发首先学哪些基础
  • 什么网站利于优化河北省建设局网站材料备案
  • 自学装修设计从哪里入手沈阳百度seo
  • 做jsp网站用哪些软件下载如何利用网站赚钱
  • 注册网站域名需要什么湘潭公司做网站
  • 一个网站如何优化企业资质查询平台
  • 模板网站为什么做不了优化山西网络网站建设销售公司
  • 建设什么网站可以赚钱设计本网站是用什么做的
  • 荆州市网站建设策划师
  • 苏州中国建设银行招聘信息网站中国企业登记网
  • 网站服务器的重要性新闻软文范例大全
  • 茶叶网站建设一般的风格加大志愿服务网站建设
  • 湖州医院网站建设方案网页游戏知乎
  • 以网站建设为开题报告临海门户网站住房和城乡建设规划局
  • 河南省大型项目建设办公室网站wordpress置顶功能
  • 奉化网站建设三合一网站建设多少钱