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

怎么做根优酷差不多的网站推广网站有哪些

怎么做根优酷差不多的网站,推广网站有哪些,wowway wordpress,微信注册网站入口文章目录 为什么需要 Looper成员MessageQueueLooperHandler lambda 机制图 为什么需要 Looper main函数/普通函数执行完后,整个进程/线程也就结束了。为了让处理可执行对象的进程/线程长时间运行,需要无限循环加事件通知的机制。 int main() {while(tr…

文章目录

  • 为什么需要 Looper
  • 成员
    • MessageQueue
    • Looper
    • Handler lambda
  • 机制图

为什么需要 Looper

main函数/普通函数执行完后,整个进程/线程也就结束了。为了让处理可执行对象的进程/线程长时间运行,需要无限循环加事件通知的机制

int main()
{while(true){1. 线程进入休眠状态,等待通知;2. 其它地方给当前线程发送通知,线程从休眠中唤醒,读取通知,处理通知3. 进入下一个循环}return 0;
}

成员

MessageQueue

MessageQueue:装message的容器。

  • 使用 pool 享元设计模式。

  • 有消息处理,数量不能过多。pool会超出容量。

  • 根据时间排序,

    • message queue队列满的时候,阻塞,直到用户通过next取出消息。

    • 当出队 next方法 被调用,通知MessagQueue可以进行消息的入队。

    // frameworks/base/core/java/android/os/MessageQueue.javaboolean enqueueMessage(Message msg, long when) {
    

生产者消费者

  • 入队 生产者:子线程 向消息队列添加消息和Handler

  • 出队 消费者工作线程:工作线程依此轮循,轮询到了MSG就会执行

    • java 执行了Looper.loop() 的线程(往往是主线程。因此MSG的消费,执行,都在主线程中)
    • cpp Looper::prepare/new Looper的线程

数量关系:(有说法是每个进程只有一个MessageQueue。但我看起来是觉得每个工作线程都有且只有一个MessageQueue)

  • java

    // frameworks/base/core/java/android/os/Looper.javaprivate 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));
    }// sThreadLocal.get() will return null unless you've called prepare().
    @UnsupportedAppUsage
    static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
    
  • native

    class Looper : public RefBase {Vector<MessageEnvelope> mMessageEnvelopes; // guarded by mLock
    

Looper

在线程(一般是主线程)中执行Looper.loop(),则这个线程就是“工作线程”。可以认为是MSG的消费者:所有的MSG的消费,执行都是在该线程中。

  • 调用了 Looper::loop() 的线程,会从进程的MessageQueue中取出、处理MSG,并执行Hanlder的重载。

  • 因为 MessageQueue 是线程安全的,所以可以有多个线程调用 Looper::loop(),这些线程并行的处理Hanlder。

对于app来说,这个“工作线程”就是主线程。app启动/挂断,一定是从主线程的 main函数 开始的

// frameworks/base/core/java/android/app/ActivityThread.java
public static void main(String[] args) {// 准备loopLooper.prepareMainLooper();Looper.myLooper().setMessageLogging(new LogPrinter(Log.DEBUG, "ActivityThread"));// 让loop运行起来. 一直循环,保障进程一直执行,如果退出,说明程序关闭Looper.loop();

数量关系:进程中可以在进程中指定一个/多个工作线程,每个工作线程拥有一个Looper

  • 一个线程只允许有一套Handler通讯机制,只有一个Looper

    在native层 一个线程new多个Looper是不建议的,但神奇的是这往往并不会出错,符合能跑就行的思想。

  • 一个进程可以有多个工作线程,从而一个进程中可有多个Looper

Handler lambda

狭义的来说

  • Handler是一个类,一个线程有多个 Handler对象 ——设计模式命令模式
  • 定义 Handler时,需要指定 Looper 意味着于此同时确定了对应的MessageQueue和工作线程。
  • 各个线程怎么区分其中的msg该让哪个Handler执行呢?
    • Handler.sendMessage时会把this(也就是哪个Handler)传递给MessageQueue。
    • 所以,才能让对应 Handler 执行其 handleMessage方法

广义来说:Handler是一种线程通信的方案。

  • 作为方案,MessageQueue和Looper也包含其中

  • 实际上是内存共享的方案

    • MessageQueue这个容器 在同一进程中的线程间是 共享 的,

    • 主线程可以通过loop死循环去不断的访问 MessageQueue。

为什么 wait/notify用处不大:因为handler已经将需要这部分功能进行了Linux层的封装 使用epoll多路IO复用进行管理。

机制图

解决线程之间的通讯:(并不跨进程)

其他跨线程通信:retrofit,eventbus,rxjava都是使用了主线程MainThread的,底层都使用了Handler机制(Looper机制)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://www.dtcms.com/wzjs/167758.html

相关文章:

  • 可以看的网站的浏览器有哪些网络营销渠道可分为哪些
  • 如何做网站跳转页面竞价推广托管开户
  • 网站教学淘宝推广工具
  • 做视频网站把视频放在哪里北京互联网公司有哪些
  • 社群小程序搭建简述seo
  • 做网站新闻app开发公司有哪些
  • 做新房用哪个网站好张雷明履新河南省委常委
  • 吉安网站建设公司谷歌seo优化技巧
  • 制作网站西安seo排名外包
  • 武汉seo微博seo营销
  • 用美国服务器做网站会被墙吗江阴企业网站制作
  • 清仓在什么网站做网站怎么优化排名的方法
  • 北京做手机网站的公司怎么自己创建一个网站
  • 音速企业名录搜索软件公司关键词seo
  • 手工艺品出口网站建设策划书微信公众号推广
  • 个人网站的订单接广告推广
  • 海淘哪些网站做攻略好神马站长平台
  • 做ui的哪个威客网站比较好青岛谷歌seo
  • 怎么做网站推广临沂网站备案查询工信部官网
  • 有那种做订单的网站吗整合营销方案
  • wd设计视图可以做网站吗南京seo排名优化公司
  • 甘肃农产品网站建设英文网站推广
  • 网站建设推广邮件宁波seo快速优化平台
  • 网站推广的全套方式自制网页
  • 网站建设书籍篮网目前排名
  • 政府门户网站建设工作计划seo可以提升企业网站的
  • 容桂网站制作效率好郴州网站建设
  • wordpress ueditor 代码 转义成都纯手工seo
  • 建网站详细步骤推广营销策划方案
  • 自贡做响应式网站开发公司百度seo教程网