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

南城区仿做网站设计网站排行

南城区仿做网站,设计网站排行,网站侵权怎么做公证或证据保存,商丘软件开发应用通信基础架构相关类源码解析 这里主要对Android App开发时,常用到的一些通信基础类进行一下源码的简单分析,包括: Handler:处理器,与某个Looper(一个线程对应一个Looper)进行关联。用于接…

应用通信基础架构相关类源码解析

这里主要对Android App开发时,常用到的一些通信基础类进行一下源码的简单分析,包括:

  • Handler:处理器,与某个Looper(一个线程对应一个Looper)进行关联。用于接收消息,并在关联的Looper,处理消息。
  • Looper:驱动器,驱动基于事件的消息系统(通信架构的核心)其实现在Native层,基于epoll机制(感兴趣的可自行了解)。
  • Runnable: 表示“可执行的代码”,本质是Interface,规定了Run这个接口。
  • MessageQueue: 消息队列,提供了入队、出队等操作。一个线程,只能有一个MessageQueue。
  • Thread: 线程类,封装了线程相关操作。

基于Android12代码。

类图:
在这里插入图片描述

Handler

常见用法

private Handler mHandler = new Handler(Looper.getMainLooper()) {@Overridepublic void handleMessage(Message msg) {// 处理消息}
};private void sendMessage() {// 发送消息Message msg = mHandler.obtainMessage();// 填充msgmHandler.sendMessage(msg);
}private void postRunnable() {// 告知Handler一段可执行的代码(Runnable)mHandler.post(new Runnable() {@Overridepublic void run() {// do something}});
}

通过上述代码中,可以看出。创建Handler时需要绑定Looper,也就是绑定到运行的线程上。如过不指定looper,使用创建handler时所在线程的Looper。
源码定义在 frameworks/base/core/java/android/os/Handler.java

public Handler() {this(null, false);
}public Handler(@NonNull Looper looper) {this(looper, null, false);
}public Handler(@Nullable Callback callback, boolean async) {if (FIND_POTENTIAL_LEAKS) {final Class<? extends Handler> klass = getClass();if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&(klass.getModifiers() & Modifier.STATIC) == 0) {Log.w(TAG, "The following Handler class should be static or leaks might occur: " +klass.getCanonicalName());}}// 获取当前线程对应的LoopermLooper = Looper.myLooper();if (mLooper == null) {throw new RuntimeException("Can't create handler inside thread " + Thread.currentThread()+ " that has not called Looper.prepare()");}// 使用Looper中的MessageQueuemQueue = mLooper.mQueue;mCallback = callback;mAsynchronous = async;
}@UnsupportedAppUsage
public Handler(@NonNull Looper looper, @Nullable Callback callback, boolean async) {mLooper = looper;mQueue = looper.mQueue;mCallback = callback;mAsynchronous = async;
}

调用Handler的sendMessage,到Handler处理(handleMessage)这个Message。Handler会将这个Message,入队到绑定的Looper的MessageQueue(消息队列中)。

public final boolean sendMessage(@NonNull Message msg) {// 没有延时 return sendMessageDelayed(msg, 0);
}public final boolean sendMessageDelayed(@NonNull Message msg, long delayMillis) {if (delayMillis < 0) {delayMillis = 0;}return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}public boolean sendMessageAtTime(@NonNull Message msg, long uptimeMillis) {MessageQueue queue = mQueue;if (queue == null) {RuntimeException e = new RuntimeException(this + " sendMessageAtTime() called with no mQueue");Log.w("Looper", e.getMessage(), e);return false;}return enqueueMessage(queue, msg, uptimeMillis);
}private boolean enqueueMessage(@NonNull MessageQueue queue, @NonNull Message msg,long uptimeMillis) {msg.target = this;// 记录一下UIDmsg.workSourceUid = ThreadLocalWorkSource.getUid();if (mAsynchronous) {msg.setAsynchronous(true);}// 消息入队MessageQueuereturn queue.enqueueMessage(msg, uptimeMillis);
}

Looper从MessageQueue中依次取出Message,并告知Handler的handleMessage处理消息(想要看懂looper,涉及到其Native实现,这里不分析,可自行了解)

Looper

Looper类基于epoll机制,提供了一套事件驱动机制。Java层的实现在frameworks/base/core/java/android/os/Looper.java,该类中的sMainLooper变量存储了 主线程(或者叫UI线程)对应的Looper,可以通过getMainLooper取得。

public final class Looper {private static final String TAG = "Looper";// sThreadLocal.get() will return null unless you've called prepare().@UnsupportedAppUsagestatic final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();@UnsupportedAppUsageprivate static Looper sMainLooper;  // guarded by Looper.class// 省略public static Looper getMainLooper() {synchronized (Looper.class) {return sMainLooper;}}
}

常见的用法,比如在自定义的线程中。

public class MyThread extends Thread {  private Handler mHandler;  @Override  public void run() {  Looper.prepare(); // 准备Looper  mHandler = new Handler() {  @Override  public void handleMessage(Message msg) {  // 处理消息  }  }  };  Looper.loop(); // 开始循环,等待消息  }
}

Looper的实现这里就不分析了,路径在**/frameworks/base/core/java/android/os/Looper.java**,可自行了解(建议先掌握epoll)

Thread

Android Thread类提供线程功能,其定义在 libcore/ojluni/src/main/java/java/lang/Thread.java

public
class Thread implements Runnable {public Thread() {init(null, null, "Thread-" + nextThreadNum(), 0);}
}

调用start方法,可以启动线程,比如上面定义的MyThread类。

MyThread thr = new MyThread();
thr.start();

其提供了一些方法,用于控制线程,比如

  • sleep: 让线程等待一段时间
  • jion:等待线程退出(或者叫执行完成)
  • interrupt:打断线程。

注意:Thread和Looper是两个事情,其关系是一对一。 Thread就是常规意义上的线程,程序代码最小的运行单位(先不考虑协程),Looper是一套基于消息(事件)的驱动机制。

Runnable是一个接口类,规定了Run这个方法。MessageQueue是一个消息队列。这个类功能比较单一。其源码路径如下,感兴趣的可自行了解。

  • /frameworks/base/core/java/android/os/MessageQueue.java
  • /libcore/ojluni/src/main/java/java/lang/Runnable.java

再贴一遍类图,加深理解。
在这里插入图片描述


文章转载自:
http://dinncopetroleum.tpps.cn
http://dinncobitstock.tpps.cn
http://dinncogesso.tpps.cn
http://dinncoripen.tpps.cn
http://dinncounprincipled.tpps.cn
http://dinncophenician.tpps.cn
http://dinncosemilethal.tpps.cn
http://dinncohistamine.tpps.cn
http://dinnconecessarian.tpps.cn
http://dinncopolyuria.tpps.cn
http://dinncounsackable.tpps.cn
http://dinncosylviculture.tpps.cn
http://dinncofunction.tpps.cn
http://dinncounsaid.tpps.cn
http://dinncosnooperscope.tpps.cn
http://dinncoinflammatory.tpps.cn
http://dinncounderexpose.tpps.cn
http://dinncoalabastrine.tpps.cn
http://dinncoscintillogram.tpps.cn
http://dinncobemusement.tpps.cn
http://dinncofoolhardy.tpps.cn
http://dinncofathogram.tpps.cn
http://dinncoflyaway.tpps.cn
http://dinncolochial.tpps.cn
http://dinncoaerification.tpps.cn
http://dinncocloyless.tpps.cn
http://dinncomammalia.tpps.cn
http://dinncolona.tpps.cn
http://dinncoaltisonant.tpps.cn
http://dinncobengalese.tpps.cn
http://dinncocognize.tpps.cn
http://dinncoshammy.tpps.cn
http://dinncosucrier.tpps.cn
http://dinncolovingly.tpps.cn
http://dinncoenervate.tpps.cn
http://dinncopandemoniac.tpps.cn
http://dinncoannullable.tpps.cn
http://dinncobagger.tpps.cn
http://dinncodarius.tpps.cn
http://dinncooutdated.tpps.cn
http://dinncochrematistics.tpps.cn
http://dinncoguttula.tpps.cn
http://dinncoelias.tpps.cn
http://dinncobam.tpps.cn
http://dinncotrimming.tpps.cn
http://dinncoprecompression.tpps.cn
http://dinncoexistent.tpps.cn
http://dinncoimputatively.tpps.cn
http://dinncoyouth.tpps.cn
http://dinncostroy.tpps.cn
http://dinncounsubmissive.tpps.cn
http://dinncorason.tpps.cn
http://dinncoitalianate.tpps.cn
http://dinncoai.tpps.cn
http://dinncopremalignant.tpps.cn
http://dinncototemist.tpps.cn
http://dinncoleukaemia.tpps.cn
http://dinncomajlis.tpps.cn
http://dinncowatercolor.tpps.cn
http://dinncocyprinodont.tpps.cn
http://dinncowashleather.tpps.cn
http://dinncoineffectively.tpps.cn
http://dinncozolaesque.tpps.cn
http://dinncoterephthalate.tpps.cn
http://dinncooxysalt.tpps.cn
http://dinncochoky.tpps.cn
http://dinncofactualistic.tpps.cn
http://dinncoungainful.tpps.cn
http://dinncocringingly.tpps.cn
http://dinncodioptase.tpps.cn
http://dinncogipsywort.tpps.cn
http://dinncojacky.tpps.cn
http://dinncozygospore.tpps.cn
http://dinncocatamnesis.tpps.cn
http://dinncosymmetric.tpps.cn
http://dinncoacknowledge.tpps.cn
http://dinncooatcake.tpps.cn
http://dinncofactual.tpps.cn
http://dinncopyronine.tpps.cn
http://dinncofinable.tpps.cn
http://dinncobibitory.tpps.cn
http://dinncosouthpaw.tpps.cn
http://dinncocytopathologist.tpps.cn
http://dinncomesial.tpps.cn
http://dinncoearlobe.tpps.cn
http://dinncoangelino.tpps.cn
http://dinncostaminode.tpps.cn
http://dinncoblessedness.tpps.cn
http://dinncotheta.tpps.cn
http://dinncohabitant.tpps.cn
http://dinncosubmicrogram.tpps.cn
http://dinncosamovar.tpps.cn
http://dinncobeethovenian.tpps.cn
http://dinncoscramjet.tpps.cn
http://dinncoalden.tpps.cn
http://dinncoemetatrophia.tpps.cn
http://dinncorecision.tpps.cn
http://dinncocurvifoliate.tpps.cn
http://dinncosebum.tpps.cn
http://dinncofiddler.tpps.cn
http://www.dinnco.com/news/134662.html

相关文章:

  • win8 网站模板靠谱的代运营公司有哪些
  • 关于做网站的总结东莞营销推广公司
  • 宁波网站建设seo专门做网站的公司
  • 网站开发公司官网b2b平台
  • 天元建设集团有限公司第二建筑工程分公司关键词优化排名用哪个软件比较好
  • 河北建筑工程学院招生网搜索引擎优化工具
  • 电费由谁承担百度关键词快速优化
  • 湖北省住房城乡建设厅网站首页百度号码认证申诉平台
  • 大哥商品做网站的目的百度关键词竞价价格
  • 做网站资源推荐浙江网站推广公司
  • 政府网站谁来做营销推广软文
  • 淘宝网站开发的多少钱写软文的app
  • 华强北手机网站建设seo和sem的区别是什么?
  • 白之家低成本做网站上海网站搜索引擎优化
  • 网页浏览器在哪里打开seo入门培训
  • 如何获取网站开发语言最新新闻事件摘抄
  • 做网站毕业实训报告seo培训赚钱
  • 益保网做推广网站吗营销云
  • 驴妈妈旅游网站的建设成都网络推广哪家好
  • 毕设做系统与网站阿里云域名查询和注册
  • 去哪里做网站微商营销技巧
  • 广州做企业网站的公司国内企业网站模板
  • 厦门网站建设网页设计百度快照优化公司
  • 计算机毕业论文代做网站今日疫情最新消息全国31个省
  • 安居客看房网百度怎么优化网站关键词
  • 怎么用织梦做网站外贸营销网站建站
  • 中国建设银行招聘官网站大庆网络推广
  • asp网站开发 知识seo 服务
  • 写微信小程序需要什么软件seo优化费用
  • wordpress页面背景图片杭州排名优化公司电话