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

潞城网站建设新手学纪事本html代码做网站

潞城网站建设,新手学纪事本html代码做网站,弱电网站源码,翻译网站怎么做1 前言 Handler 即处理器#xff0c;常用于跨线程通讯#xff1a;线程A 和线程 B 拥有同一个 handler 对象#xff0c;在线程 A 中使用 handler 的 sendMessage() 方法发送消息#xff0c;在线程 B 中使用 handler 的 handleMessage() 方法处理消息。 Handler 家族主要有常用于跨线程通讯线程A 和线程 B 拥有同一个 handler 对象在线程 A 中使用 handler 的 sendMessage() 方法发送消息在线程 B 中使用 handler 的 handleMessage() 方法处理消息。 Handler 家族主要有Message、Handler、MessageQueue、Looper。 1应用场景 子线程处理完耗时操作后请求主线程更新 UI 线程 A 定时给线程 B 发送消息线程 A 周期性给线程 B 发送消息 2Handler 家族 Message消息类通过 obtain() 方法可以生成一个 message 对象每个 message 对象必须有一个 handler 对象Handler消息处理器用于生成obtainMessage和处理消息handleMessageMessageQueue消息队列用于存储消息通过 enqueueMessage() 放入消息next() 取出消息Looper循环器用于取出消息并通知 handler 执行消息。 3Handler 机制基本原理 假设在线程 A 中创建了 handler 对象重写了 handler 的 handleMessage() 方法并且将 handler 对象传给了线程 B则线程 B 和线程 A 间的通讯如下 生成消息线程 B 通过 handler.obtainMessage() 生成消息内部会调用 Message.abtain() 方法并且会把当前 handler 传给 message 对象发送消息线程 B 通过 handler.sendMessage() 发送消息再调用 mQueue.enqueueMessage() 将消息放入消息队列取出消息线程A 中 mLooper 对象的 loop() 方法一直循环执行若 mQueue 中没数据会等待其内部会调用 mQueue 对象的 next() 方法取出一个消息 msg执行任务线程 A 中取出的 msg 对象在创建时已绑定 handler通过调用 msg.target.dispatchMessage() 方法通知 handler 执行 handleMessage() 方法。 2 Handler 机制源码解析 2.1 Message 1类图 2生成消息 public static Message obtain() {synchronized (sPoolSync) {if (sPool ! null) {Message m sPool;sPool m.next;m.next null;m.flags 0; // clear in-use flagsPoolSize--;return m;}}return new Message(); }public static Message obtain(Handler h) {Message m obtain();m.target h;return m; } sPool 是可用的空消息对象池 其本质是链表sPool 指向链表的头结点next 指向下一个节点。 3处理消息 msg.target.dispatchMessage(msg)//最终会执行如下一种 msg.callback.run() handler.mCallback.handleMessage(msg) handler.handleMessage(msg) target 是 Message 绑定的 handler 对象。  2.2 Handler 1类图 2Looper 对象的获取 若 handler 在主线程中创建则不需要显式地给 handler 传递 Looper 对象。在主线程被创建时系统会为主线程创建 Looper 对象并开启消息循环。 public Handler() {this(null, false); }public Handler(Handler.Callback callback, boolean async) {...mLooper Looper.myLooper(); //获取与当前线程绑定的Looper对象...mQueue mLooper.mQueue;... } 若 handler 在子线程中创建则需要显示地传递 looper 对象因为子线程在创建时不会创建 Looper 对象。 public Handler(Looper looper) {this(looper, null, false); }public Handler(Looper looper, Handler.Callback callback, boolean async) {mLooper looper;mQueue looper.mQueue;... } 3生成消息 public final Message obtainMessage() {return Message.obtain(this); } 将 this 赋值给 message.target与 message 对象绑定。 4发送消息 public final boolean sendMessage(Message msg) {return sendMessageDelayed(msg, 0); }public final boolean sendMessageDelayed(Message msg, long delayMillis) {if (delayMillis 0) {delayMillis 0;}return sendMessageAtTime(msg, SystemClock.uptimeMillis() delayMillis); }public boolean sendMessageAtTime(Message msg, long uptimeMillis) {MessageQueue queue mQueue;...return enqueueMessage(queue, msg, uptimeMillis); }private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {msg.target this;if (mAsynchronous) {msg.setAsynchronous(true);}return queue.enqueueMessage(msg, uptimeMillis); } 从 enqueueMessage() 方法中可以看到在消息入队之前将 this 赋值给了 msg确保每个 msg 都能绑定一个 handler。 5发送任务 public final boolean post(Runnable r) {return sendMessageDelayed(getPostMessage(r), 0); }private static Message getPostMessage(Runnable r) {Message m Message.obtain();m.callback r;return m; } 可以看到即使发送的是 runnable也会封装为 message。  6处理消息 public void dispatchMessage(Message msg) {if (msg.callback ! null) {handleCallback(msg);} else {if (mCallback ! null) {if (mCallback.handleMessage(msg)) {return;}}handleMessage(msg);} }private static void handleCallback(Message message) {message.callback.run(); }public void handleMessage(Message msg) { }public interface Callback {public boolean handleMessage(Message msg); } 从 dispatchMessage()  方法中可以看到处理消息的次序为 msg.callback.run()mCallback.handleMessage(msg)handleMessage(msg) 2.3 MessageQueue 1类图 2存储消息 boolean enqueueMessage(Message msg, long when) {synchronized (this) {...Message p mMessages;boolean needWake;if (p null || when 0 || when p.when) {msg.next p;mMessages msg;needWake mBlocked;} else {needWake mBlocked p.target null msg.isAsynchronous();Message prev;for (;;) { //根据消息时间查找待插入位置prev p;p p.next;if (p null || when p.when) {break;}if (needWake p.isAsynchronous()) {needWake false;}}msg.next p; //插入消息prev.next msg;}if (needWake) {nativeWake(mPtr); //唤醒 looper}}return true; } mMessages 是消息队列的链头。 3取出消息 Message next() {...int nextPollTimeoutMillis 0;for (;;) {...nativePollOnce(ptr, nextPollTimeoutMillis); //等待synchronized (this) {final long now SystemClock.uptimeMillis();Message prevMsg null;Message msg mMessages;if (msg ! null msg.target null) {do {prevMsg msg;msg msg.next;} while (msg ! null !msg.isAsynchronous());}if (msg ! null) {if (now msg.when) {nextPollTimeoutMillis (int) Math.min(msg.when - now, Integer.MAX_VALUE);} else { //取出消息...if (prevMsg ! null) {prevMsg.next msg.next;} else {mMessages msg.next;}msg.next null;...return msg;}} ...}...} } 2.4 Looper 1类图 2创建 Looper 对象 public static void prepare() {prepare(true); }private static void prepare(boolean quitAllowed) {if (sThreadLocal.get() ! null) {throw new RuntimeException(Only one Looper may be created per thread);}sThreadLocal.set(new Looper(quitAllowed)); //创建Looper对象并与当前线程绑定 } 3创建 MessageQueue private Looper(boolean quitAllowed) {mQueue new MessageQueue(quitAllowed);mThread Thread.currentThread(); } 4循环 public static void loop() {final Looper me myLooper();...final MessageQueue queue me.mQueue;...for (;;) {Message msg queue.next(); //可能会等待...msg.target.dispatchMessage(msg); //处理消息...msg.recycleUnchecked(); //回收消息} } 3 应用 3.1 应用一 1主线程处理消息 Handler handler new Handler() {Overridepublic void handleMessage(Message msg) {System.out.println(打印消息);} }; 2子线程发送消息 handler.sendEmptyMessage(0x111); 3.2 应用二 1主线程处理消息 Handler handler new Handler(); 2子线程发送消息 handler.post(new Runnable() {Overridepublic void run() {System.out.println(打印消息);} }); 4 拓展 第3节中的案例都是子线程给主线程发送消息但是某些场景需要主线程给子线程发送消息或2个子线程间发送消息。默认情况下系统会为主线程创建 Looper 对象并开启消息循环但新建的子线程中不会创建 Looper 对象此时就需要应用到 HandlerThread 类。 1HandlerThread 类图 2HandlerThread 核心源码 // 消息循环通过threadHandler.start()开启循环 public void run() {mTid Process.myTid();Looper.prepare(); //创建looper对象并与当前线程绑定synchronized (this) {mLooper Looper.myLooper();notifyAll();}Process.setThreadPriority(mPriority);onLooperPrepared();Looper.loop(); //消息循环mTid -1; }//获取handler并注入mLooper public Handler getThreadHandler() {if (mHandler null) {mHandler new Handler(getLooper());}return mHandler; } 3应用 线程 A处理消息 HandlerThread handlerThread new HandlerThread(A); handlerThread.start(); //Handler handler handlerThread.getThreadHandler(); Handler handler new Handler(handlerThread.getLooper()); 线程 B发送消息 handler.post(new Runnable() {Overridepublic void run() {System.out.println(打印消息);} });
http://www.hkea.cn/news/14435177/

相关文章:

  • 南山网站建设公司乐云seo怀化建网站
  • 百搜网络科技有限公司沈阳网站seo排名优化
  • 建设银行分期手机网站网站设计师前景
  • wordpress仿站容易被收录不手机网站建设技术方案
  • 锡林浩特网站建设企业建设网站对客户的好处
  • 吉林律师网站建设多少钱网站开发 估算 excel
  • 上海哪家网站建设好vue做网站好吗
  • 视频教学网站开发需求分析wordpress 收费吗
  • 网站建设中正在为您转国家高新技术企业税收优惠政策
  • 美食门户类网站模版移动端网站开发公司
  • 哈尔滨的建设信息网站什么软件可以攻击网站
  • 上海频道网站建设app软件开发公司哪家好
  • 怎么用iapp做网站软件wordpress创建相册
  • 一台虚拟主机能建设几个网站制作公司网页可以用网上图片吗
  • 推荐几个没封的网站php源码网站安装
  • 江门英文网站建设成都网站设计创新互联
  • 怎么自创网站无锡建设管理服务中心
  • 怎样把网站推广出去程建网一建培训怎么样
  • 深圳网站设计十年乐云seo10_10_微信里网站怎么做的
  • 重庆个人建站模板学校网站网页模板
  • 网站产品图片尺寸集团门户网站建设公司
  • 天津网站建设好公司一个域名可以做几个网站
  • 编写网站策划书最好的文件管理软件
  • 觅知网ppt模板下载seo网站建设微
  • 公司网站域名更改怎么做做网站违法吗
  • 深圳网站设计公司如何建筑人才网怎么样
  • 阳西哪里有做网站网站与网页区别是什么意思
  • 赣州深科网站建设opkg 安装wordpress
  • 论企业网站职能建设seo综合查询怎么回事
  • 阿里云服务器架设网站杭州外贸网站建设公司排名