异步

android消息机制,异步和多线程

隐身守侯 提交于 2019-12-05 12:57:20
android 消息机制 , 异步和多线程 前言 在xxxx 1.92 正式版的时候付费购买曾单独封装了一个流程 PaymentFlow 并继承于 Handler, 调用方只要依据这个流程创建流程实例并触发开始 , 实例即可依据设定的支付流程完成 . 但在异步和多线程方面却有 ’ java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()’ 的问题 . 最近在作风网络库的替换 , 网络库使用的 Handler 的继承类 MessageHandler 作为回调 . 同样也存在多线程的异步调用或诸塞的问题 , 所以在此就将 Handler 的机制在研究一遍 . 1. Handler,Looper,Activity Android 应用程序是消息驱动的 , 并通过 Looper,Handler 来实现消息循环机制 , 且是针对线程的 . 一个线程可以存在 ( 当然也可以不存在 ) 一个消息队列和一个消息循环 (Looper), 特定线程的消息只能分发给本线程 , 不能进行跨线程 , 跨进程通讯 . 但是创建的工作线程默认是没有消息循环和消息队列的 , 如果想让该线程具有消息队列和消息循环 , 需要在线程中首先调用 Looper.prepare()

I/O多路复用模型

旧巷老猫 提交于 2019-12-05 11:50:59
背景 在文章 《unix网络编程》(12)五种I/O模型 中提到了五种I/O模型,其中前四种:阻塞模型、非阻塞模型、信号驱动模型、I/O复用模型都是同步模型;还有一种是异步模型。 想写一个系列的文章,介绍从I/O多路复用到异步编程和RPC框架,整个演进过程,这一系列可能包括: I/O多路复用模型 epoll介绍与使用 Reactor和Proactor模型 为什么需要异步编程 enable_shared_from_this用法分析 网络通信库和RPC 为什么有多路复用? 多路复用技术要解决的是“通信”问题,解决核心在于“同步事件分离器”(de-multiplexer),linux系统带有的分离器select、poll、epoll网上介绍的比较多,大家可以看看这篇介绍的不错的文章: 我读过的最好的epoll讲解 。通信的一方想要知道另一方的状态(以决定自己做什么),有两种方法: 一是轮询,二是消息通知。 轮询 轮询的一种典型的实现可能是这样的:当然这里的epoll_wait()也可以使用poll()或者select()替换。 while (true) { active_stream[] = epoll_wait(epollfd) for i in active_stream[] { read or write till } } 轮询方式主要存在以下不足: 增加系统开销

Vert.x Blueprint 系列教程(二) | Vert.x Kue 教程(Web部分)

爷,独闯天下 提交于 2019-12-05 09:14:03
上部分蓝图教程 中我们一起探索了如何用Vert.x开发一个基于消息的应用。在这部分教程中,我们将粗略地探索一下 kue-http 模块的实现。 Vert.x Kue REST API kue-http 模块中只有一个类 KueHttpVerticle ,作为整个REST API以及UI服务的实现。对REST API部分来说,如果看过我们之前的 Vert.x 蓝图 | 待办事项服务开发教程 的话,你应该对这一部分非常熟悉了,因此这里我们就不详细解释了。有关使用Vert.x Web实现REST API的教程可参考 Vert.x 蓝图 | 待办事项服务开发教程 。 将Kue UI与Vert.x Web进行适配 除了REST API之外,我们还给Vert.x Kue提供了一个用户界面。我们复用了Automattic/Kue的用户界面所以我们就不用写前端代码了(部分API有变动的地方我已进行了修改)。我们只需要将前端代码与Vert.x Web适配即可。 首先,前端的代码都属于静态资源,因此我们需要配置路由来允许访问静态资源: router.route().handler(StaticHandler.create(root)); 这样我们就可以直接访问静态资源咯~ 注意到Kue UI使用了 Jade (最近貌似改名叫Pug了)作为模板引擎,因此我们需要一个Jade模板解析器。好在Vert.x

React入门知识点清单

♀尐吖头ヾ 提交于 2019-12-05 07:26:39
做前端的一定都知道现在是三大框架——Vue、React、Angular三足鼎立的时代。Vue是公认的最容易入门的,因为它文件结构上有传统的HTML的影子,让刚接触它的前端人员刚到很“亲切”。Angular虽然也有保留HTML,但它却是最难入门的,究其原因可能和他是由Google的后端程序员开发的,又是用的纯Typescript,异步使用Rxjs,对于前端新人来说门槛太高。React入门难度适中,网上各种言论说React上手比Vue难,可能难就难在不能深刻理解JSX,或者对ES6的一些特性理解得不够深刻,导致觉得有些点难以理解,然后说React比较难上手。今天就来整理一些React入门需要掌握哪些知识点。 为什么要引入 React 在写 React 的时候,你可能会写类似这样的代码: import React from 'react' function A() { // ...other code return <h1>前端桃园</h1> } 你肯定疑惑过,上面的代码都没有用到 React,为什么要引入 React 呢? 如果你把 import React from 'react' 删掉,还会报下面这样的错误: 那么究竟是哪里用到了这个 React,导致我们引入 React 会报错呢,不懂这个原因,那么就是 JSX 没有搞得太明白。 你可以讲上面的代码(忽略导入语句)放到 在线

Python 3.5 协程究竟是个啥

╄→гoц情女王★ 提交于 2019-12-05 04:31:55
原文链接 : How the heck does async/await work in Python 3.5? 原文作者 : Brett Cannon 译文出自 : 掘金翻译计划 译者 : @Yushneng 校对者: @L9m , @iThreeKing 作者是 Python 语言的核心开发人员,作者在这篇文章里先是是从 Python 异步编程的发展历史一直介绍到 Python 3.5 中 async / await 新特性的提出,又从底层的实现的差异一直延伸到完整的代码实例,来说明旧的生成器作为协程的“权宜之计”与新语法的差别。真正做到了深入浅出地厘清了 Python 3.5 异步编程的各种概念及其原理,非常值得学习!协程和事件循环无论从理念还是实现上,都比线程好太多,看完这篇文章之后你一定会和作者有同样的感受:“我要在所有地方都用协程!”,所以,还在用 2.7 的,赶紧升级吧! 以下为译文全文,感谢 @L9m , @iThreeKing 的审校。 作为 Python 核心开发者之一,让我很想了解这门语言是如何运作的。我发现总有一些阴暗的角落我对其中错综复杂的细节不是很清楚,但是为了能够有助于 Python 的一些问题和其整体设计,我觉得我应该试着去理解 Python 的核心语法和内部运作机制。 但是直到最近我才理解 Python 3.5 中 async / await

翻译:introduce to tornado-Asynchronous Web Services

不打扰是莪最后的温柔 提交于 2019-12-05 01:25:55
异步的web请求 迄今为止,我们通过tornado这个强大的框架的功能创建了很多web应用,它简单,易用,它有足够强大的理由让我们选择它做为一个web项目的框架.我们最需要使用的功能是它在服务端的异步读取功能.这是一个非常好的理由:tornado可以让我们轻松地完成非阻塞请求的相应.帮助我们更有效率地处理更多事情.在这一章节中,我们将会讨论tornado最基本的异步请求.同时也会涉及一些长连接轮询的技术,我们将会通过编写一个简单的web应用来演示服务器如何在较少资源的情况下,处理更多的web请求. 异步的web请求 大部分的web应用(包括之前的所有例子),实际上都是阻塞运行的.这意味着当接到请求之后,进程将会一直挂起,直到请求完成.根据实际的统计数据,tornado可以更高效且快速地完成web请求,而不需要顾虑阻塞的问题.然而对于一些操作(例如大量的数据库请求或调用外部的API)tornado可以花费一些时间等待操作完成,这意味着这期间应用可以有效地锁定进程直到操作结束,很明显,这样将会解决很多大规模的问题. tornado给我们提供了非常好的方法去分类地处理这样的事情.去更改那些锁死进程直到请求完成的场景.当请求开始时,应用可以跳出这个I/O请求的循环,去打开另一个客户端的请求,当第一个请求完成之后,应用可以使用callback去唤醒之前挂起的进程. 通过下面的例子

jQuery.ajax()异步方法的漏洞

岁酱吖の 提交于 2019-12-04 21:55:27
在使用jQuery.ajax()异步方法的时候发现一个返回数据混合的漏洞,记录下来分享给大家。 最近在做一个数据统计分析的项目,由于网页需要加载多个数据统计的表格,而且查询数据统计表格的方法比较耗时。所以 在网页的初始化加载中调用了多个jQuery.ajax()的异步请求方法 ,分别请求不同的数据统计表格的数据。 经过多次的调试,发现如果使用同步调用的话能够实现效果(界面需要等待,加载慢),但是异步调用却总是实现不了想要的效果。 后来发现jQuery.ajax()的error返回结果中,两次请求的数据混合到了一起。 项目使用SpringMVC框架,通过response返回结果,在chrome 55和IE 11中使用得到相同的结果。 Java后台的调用: jQuery.ajax()的异步调用: A方法和B方法分别为两个比较耗时的后台方法,页面加载时使用两个jQuery.ajax()异步请求方法,方法回调error输出后台返回数据。 可以发现在前端控制台输出的结果中,一个前端返回为“两个后台方法返回数据的混合”,而另一个返回为空。再看后台Java中,两个后台方法使用的request和response的HashCode是相同的。 也就是说,即使前端的写法是发起两个不同的异步请求,但是实际上只发起了一个request请求。所以调用的两个后台方法返回结果都会放到同一个response中。 而

Android Fragment 常见问题及解决方案

∥☆過路亽.° 提交于 2019-12-04 18:18:16
Fragment(主要探讨的是support库中的Fragment) Fragment的主要意义就是提供与Activity绑定的生命周期回调 Fragment不一定要向Activity的视图层级中添加View. 当某个模块需要获得Activity的生命周期回调的时候,就可以考虑通过Fragment来实现. 例如: DialogFragment, 调用show方法来显示一个Dialog(这个一个子Window,并不在Activity的视图层级中),当旋屏时,DialogFragment利用onDestroyView回调来dismiss Dialog,然后Activity重建之后,DialogFragment利用onStart回调再显示Dialog 当然,我们也可以创建一个完全没有UI的Fragment,比如BackgroundWorkerFragment,在onResume的时候执行一个Task,在onPause的时候暂停一个Task Fragment 生命周期 Fragment的生命周期非常复杂,分为以下几种情况: 如果是通过XML中的 <fragment/> 标签实例化的,那么第一个收到的回调将是 onInflate 如果 setRetainInstance(true) ,那么当Activity重建时,Fragment的 onDestroy

Vert.x Blueprint 系列教程(二) | 开发基于消息的应用

我是研究僧i 提交于 2019-12-04 09:22:45
Vert.x 蓝图项目已经发布至Vert.x官方网站: Vert.x Blueprint Tutorials 本文章是 Vert.x 蓝图系列 的第二篇教程。全系列: Vert.x Blueprint 系列教程(一) | 待办事项服务开发教程 Vert.x Blueprint 系列教程(二) | 开发基于消息的应用 - Vert.x Kue 教程 Vert.x Blueprint 系列教程(三) | Micro Service 微服务实战 前言 欢迎回到Vert.x 蓝图系列~在本教程中,我们将利用Vert.x开发一个基于消息的应用 - Vert.x Kue,它是一个使用Vert.x开发的优先级工作队列,数据存储使用的是 Redis 。Vert.x Kue是 Automattic/kue 的Vert.x实现版本。我们可以使用Vert.x Kue来处理各种各样的任务,比如文件转换、订单处理等等。 通过本教程,你将会学习到以下内容: 消息、消息系统以及事件驱动的运用 Vert.x Event Bus 的几种事件机制(发布/订阅、点对点模式) 设计 分布式 的Vert.x应用 工作队列的设计 Vert.x Service Proxy (服务代理,即 异步RPC )的运用 更深层次的Redis运用 本教程是 Vert.x 蓝图系列 的第二篇教程,对应的Vert.x版本为 3.3.2

异步上传文件并获得返回值(完全跨域)

本秂侑毒 提交于 2019-12-04 05:51:17
异步上传文件并获得返回值(完全跨域) AJAX可以进行数据的异步请求,但对于文件和跨域问题却束手无策。 Jsonp可以进行跨域数据的异步请求,但同样不能使用于文件。 <form>表单可以进行跨域数据和文件的上传,但却会使页面跳转。 那么如何同时实现“异步”+“跨域”+“文件”+“返回值”这几个特性呢?方法如下: 原理: 将<form>表单通过一个iframe来submit,也就是将<form>的target属性设置为一个iframe的id,这样<form>的action URL就会在这个iframe中 打开,那么服务器的返回数据也就会输出到iframe中了。最后再通过主页面也iframe之间的交互完成对返回数据的读取(这涉及到跨域问题, 文章后面将介绍此问题的解决方法)。 基本结构: 前端部分(当前域名:www.test.com,与form中的action域名相同) <form action="http://www.test.com/io.php" method="POST" enctype="multipart/form-data" target="upload"> <input type="file" name="upload_file" /> <input type="submit" value="开始上传" /> </form> <iframe name="upload"