首页 文章 精选 留言 我的

精选列表

搜索[后台管理模板],共10000篇文章
优秀的个人博客,低调大师

如何使用WorkManager执行后台任务(下)

0x00 WorkManager的高级用法 在上一文中已经了解到 WorkManager的基本用法之后,今天来看看它的一些高级用法: 链式任务调用 唯一任务序列 传递参数和获取返回值 0x01 链式任务(Chained tasks) WorkManager在执行多个工作任务的时候,可以指定执行顺序。假设一个应用程序中有3个 OneTimeWorkRequest对象: workA、 workB、 workC。这几个任务需要按照顺序执行,那么可以使用 WorkManager.beginWith()方法加入 workA,这时候会返回一个 WorkContinuation对象,它定义了工作任务的执行序列。然后通过它再调用 WorkContinuation.then()把 workB和 workC加入到执行队列中,最后执行 WorkManager.enqueue()方法。 WorkManager.getInstance() .beginWith(workA) // Note: WorkManager.beginWith() returns a // WorkContinuation object; the following calls are // to WorkContinuation methods .then(workB) // FYI, then() returns a new WorkContinuation instance .then(workC) .enqueue() WorkManager会按照指定的顺序来执行 workA、 workB、 workC。如果其中有一个工作任务执行的时候返回 Worker.Result.FAILURE,那么整个执行序列就会停止。 WorkManager.beginWith()方法可以传递多个 Worker对象,表示可以并行执行的任务组,然后再调用 then()方法。当这并行任务组都执行完之后才会执行接下来 then中的工作任务。 WorkManager.getInstance() // 首先,并行执行workA1,workA2,workA3这三个任务 .beginWith(workA1, workA2, workA3) // 当三个任务都完成之后, 开始执行workB: .then(workB) // 最后再并行执行 workC1,workC2 .then(workC1, workC2) .enqueue() 还可以通过 WorkContinuation.combine()方法创建更加复杂的链接任务调用序列。它可以将两个 WorkContinuation对象合并,假设要调用如下的任务序列: val chain1 = WorkManager.getInstance() .beginWith(workA) .then(workB) val chain2 = WorkManager.getInstance() .beginWith(workC) .then(workD) val chain3 = WorkContinuation .combine(chain1, chain2) .then(workE) chain3.enqueue() 这个链式执行顺序是:子链 A->B 与子链 C->D 并行执行的, workA执行后再执行 workB,以及 workC执行后执行 workD ;然后等待 workB以及 workD都执行完,最后执行 workE。 需要注意的是, WorkManager无法保证两个子链的执行顺序,有可能 chain1比 chain2快,也有可能是 chain1比 chain2慢。 0x02 唯一任务序列(Unique work sequences) 在应用程序开发中,可能会多次把同一个链式任务添加到 WorkManager中,但希望只有一个链式任务在执行,这时候可以使用唯一任务序列对链式任务指定处理规则。假设,做一个下载文件操作,对一个文件下载链接,我们不需要重复下载,只需要添加一次,后面再添加这个任务,就忽略掉,因为我们不希望重复多次下载同一个文件。所以当添加两个同样名称为"download"操作任务时,对于唯一任务序列来说,可以通过 ExistingWorkPolicy中的 REPLACE, KEEP 和 APPEND,来指定添加的策略。 REPLACE:新任务将替换旧的 KEEP:新任务会被丢弃,旧的任务会被保持 APPEND:追加,旧任务执行之后再执行新的任务。 使用 beginUniqueWork()方法可以创建任务序列,并且可以指定唯一的一个名称(name)。然后再 ExistingWorkPolicy指定任务的替换策略 WorkContinuation continuation = mWorkManager .beginUniqueWork("download", ExistingWorkPolicy.KEEP, OneTimeWorkRequest.from(CleanupWorker)) 0x03 传递参数和获取返回值 任务执行可以传递参数以及获取到任务执行的结果。使用 WorkRequst.Builder.setInputData()方法传递一个 Data对象,它是key-value形式的对象,使用 Data.Builder来创建。在 Worker类中可以使用 Worker.getInputData()获取到参数。 同样地,在 Worker中可以使用 Worker.setOutputData()设置一个 Data对象的返回值。要获取到这个返回值就通过 LiveData<WorkStatus>。 举个栗子: 有一个下载任务,在 Worker中获取传递过来的参数url,然后执行下载,最后设置下载结果。 // the result key: const val KEY_RESULT = "result" class DownloadWorker(context : Context, params : WorkerParameters) : Worker(context, params) { override fun doWork(): Result { // 获取参数 val url = getInputData("url") // 执行下载 val result = download(url); // 设置下载结果 val output: Data = mapOf(KEY_RESULT to result).toWorkData() setOutputData(output) // 任务执行成功 return Result.SUCCESS } } 然后,通过 WorkRequest传递参数 // 构造下载链接参数 val urlData: Data = mapOf("url" to "https://developer.android.com/images/topic/libraries/architecture/workmanager-chain.svg") .toWorkData() // 构造WorkRequest并传递下载参数 val downloadWork = OneTimeWorkRequest.Builder<DownloadWorker>() .setInputData(urlData) .build() // 交给WorkManager执行任务 WorkManager.getInstance().enqueue(downloadWork) 最后,通过 WorkStatus获取返回值 WorkManager.getInstance().getStatusById(downloadWork.id) .observe(this, Observer { status -> if (status != null && status.state.isFinished) { val myResult = status.outputData.getString(KEY_RESULT, myDefaultValue) // ... do something with the result ... } }) 0x04 引用 https://developer.android.com/topic/libraries/architecture/workmanager/advanced https://developer.android.com/reference/androidx/work/ExistingWorkPolicy http://clmirror.storage.googleapis.com/codelabs/android-workmanager/index.html?index=..%2F..%2Findex#0

优秀的个人博客,低调大师

使用python实现后台系统的JWT认证

今天的文章介绍一种适用于restful+json的API认证方法,这个方法是基于jwt,并且加入了一些从oauth2.0借鉴的改良。 1. 常见的几种实现认证的方法 首先要明白,认证和鉴权是不同的。认证是判定用户的合法性,鉴权是判定用户的权限级别是否可执行后续操作。这里所讲的仅含认证。认证有几种方法: 1.1 basic auth 这是http协议中所带带基本认证,是一种简单为上的认证方式。原理是在每个请求的header中添加用户名和密码的字符串(格式为“username:password”,用base64编码)。 这种方式相当于将“用户名:密码”绑定为一个开放式证书,这会有几个问题:①每次请求都需要用户名密码,如果此连接未使用SSL/TLS,或加密被破解,用户名密码基本就暴露了;②无法注销用户的登录状态;③证书不会过期,除非修改密码。

优秀的个人博客,低调大师

网站前端和后台性能优化26

开发灵巧的事件处理程序 Develop Smart Event Handlers tag:javascript 如果有太多的事件处理逻辑部署在DOM树的不同元素上,它们的频繁执行会拖慢页面的响应速度。而使用事件委托是一个好的解决方法。如果在一个Div中有10个按钮,与其在每个按钮上都放一个事件处理程序,步入只在Div上放一个事件处理程序。事件会冒泡上溯,这样你就会捕获这一事件,并找出是哪个按钮发起的它。 同样,你并不需要等待onload事件来启动一些操作DOM树的程序。你只需要保证你需要操作的元素可用就可以了。你不需要等待所有的图片下载完毕,你应当使用DOMContentLoaded事件来替代onload事件,当然,目前并不是所有浏览器都支持这一事件,你可以使用YUI Event组件,其中包含了一个onAvailable函数。 查看Julien Lecomte的"High Performance Ajax Applications"获取更多信息。

优秀的个人博客,低调大师

网站前端和后台性能优化22

避免404错误 No 404s tag:内容 一个获得没用的404响应的HTTP请求对于宝贵的HTTP请求资源来说是完全不必要的,而且这样还会减慢用户的体验。 有的网站提供了有帮助的404错误信息,比如"你是否在寻找……?",这样虽然能提高用户体验,但同样浪费了服务端资源(比如数据库)。尤其不妙的是在请求一个外部的Javascript脚本文件失败时获得的一个404错误,因为这样不但会堵塞并行的下载,而且浏览器会尝试分析404响应的内容,来辨识它是否是有用的Javascript代码。

优秀的个人博客,低调大师

网站前端和后台性能优化11

避免重定向 (Avoid Redirects) tag:content 重定向结束于 301或302状态码。这里有一个301响应的HTTP头的例子: HTTP/1.1 301 Moved Permanently Location: http://example.com/newuri Content-Type: text/html 浏览器会自动把用户转向Location域中指明的Url地址。HTTP头里包含了重定向所需的所有信息。响应的主体一般是空的。301或者302响应都不会被实际缓存,除非添加额外的头部,比如 Expires或者Cache- Control指明了它应该被缓存。meta refresh标签和JavaScript也可以将用户重定向到不同的URL,但如果你必须执行重定向,最好的方法是使用标准的3XX HTTP状态代码,以便使后退按钮工作正常。 需要谨记的是,重定向降低了用户体验。在用户和HTML文档之间插入的重定向延误了页面的呈现和组件下载,因为它们都不可能在获得HTML文档之前开始。 一种最浪费性能的重定向频繁发生而网络开发者们却往往没有意识到,那就是当地址中应当有一个左斜线(/)却没有的时候。比如,访问http://astrology.yahoo.com/astrology会导致一个301效应并重定向到http://astrology.yahoo.com/astrology/(注意这里加了一个左斜线)。在Apache中,这可以使用mod_rewrite,或者在Apache事件处理中使用DirectorySlash指令来修补。 使用重定向的另一个常见场景是连接旧网站和新网站。还包括连接网站的不同部分,或者在不同情况下(比如依据浏览器的类型,用户的类型等)重定向用户。使用重定向来连接两个网站很简单而且需要很少的额外代码。虽然在这些情况下使用重定向减少了开发者的麻烦,但却降低了用户体验。如果两部分在同一个服务器上,可以使用Alias 和rewrite来替代重定向。如果域名变更引起了重定向,可以创建一个CNAME(一种可以创建一个别名使一个域名指向另一个的DNS记录)结合 Alias 或者mod_rewrite来替代重定向。

优秀的个人博客,低调大师

网站前端和后台性能优化14

让Ajax可以缓存 (Make Ajax Cacheable) tag:content Ajax 的好处之一是它能给用户提供瞬间的响应,因为它从服务端异步请求数据。但Ajax不能保证用户在等候那些异步的JavaScript和XML响应返回时什么都不做。在应用程序中,用户是否继续等待取决于Ajax怎样应用。比如,在一个基于Web的Email客户端用户会 等候Ajax返回他们所搜索的邮件信息。记住异步并不代表“即刻”。 为了提高性能,优化Ajax响应很重要。提高Ajax性能最重要的方式是使响应缓存,正如“添加一个过期期限和缓存控制头”这一节讨论的。这些原则同样适用于Ajax。 Gzip组件 减少DNS查询 压缩JavaScript 避免重定向 设定ETag 我们看一个例子。一个Web2,0的邮件客户端可能会用Ajax自动下载用户地址簿。如果用户从上次使用邮件网站以来没有修改她的地址簿,那么如果Ajax响应使用了长期失效时间或者缓存控制头部,地址簿就可以从缓存中读取出来。浏览器必须被告知“使用之前的缓存地址簿”而不是“请求一个新的地址簿”。可以在地址簿Ajax的URL中添加一个标识用户最后一次修改地址簿的时间戳,比如,&t=1190241612。如果地址簿从最后一次下载后没有被更改,时间戳将相同而地址簿将会从浏览器的缓存中得到来替代额外的HTTP传输。如果用户更改了她的地址簿,时间戳会保证新的URL不会和缓存中的匹配,而且浏览器会请求会请求更新的地址簿记录。 即使你的Ajax响应时动态创建的,而且只适用于一个用户,它们依然会被缓存。这样做会让你的Web2.0应用程序更快。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册