16、后台异步处理

[size=medium] 大多时候,需要后台(异步)去执行一些费时操作。如网络数据获取、复杂的算法、图片处理等,当执行这些操作时,又不想失去用户响应(类似Windows有时候程序会卡死,失去鼠标键盘响应),所以需要放到用户界面之外的一个线程里去处理这些操作。

安卓中主要有两种实现方式,1、建立线程,Runnable中run方法执行费时操作,完成时通过Handler发送消息(这种方式在之后的网络图片加载会用到),2、使用安卓自带的AsyncTask异步类,这里先考虑第二种。

先说一下AsyncTask异步类,网上复制的,理解。

[color=gray]Android提供了一套专门用于异步处理的类。即:AynsTask类。使用这个类可以为耗时程序开辟一个新线程进行处理,处理完时返回。
其实,AsynTask类就是对Thread类的一个封装,并且加入了一些新的方法。编程时,两者都可以实现同样的功能。本文后面将对AsynTask和Thread进行比较。
1、AsynTask类结构

AsysTask类主要用到的几个内部回调函数有:
doInBackGround()、onPreExecute()、onPostExecute()、onProgressUpdate(),正是这几个回调函数构成了AsynTask类的使用逻辑结构。
注意:每个AsynTask子类必须至少复写doInBackGround()方法。

2、回调逻辑关系

调用关系如下图:[/color][/size]
[img]http://dl2.iteye.com/upload/attachment/0125/3328/e56f4fe2-8070-3c30-88a1-3b9ad5183c15.jpg[/img]
[size=medium][color=gray]
1>主线程调用AsynTask子类实例的execute()方法后,首先会调用onPreExecute()方法。onPreExecute()在主线程中运行,可以用来写一些开始提示代码。
2>之后启动新线程,调用doInBackground()方法,进行异步数据处理。
3>处理完毕之后异步线程结束,在主线程中调用onPostExecute()方法。onPostExecute()可以进行一些结束提示处理。
补充:在doInBackground()方法异步处理的时候,如果希望通知主线程一些数据(如:处理进度)。这时,可以调用publishProgress()方法。这时,主线程会调用AsynTask子类的onProgressUpdate()方法进行处理。

3、各个函数间数据的传递
通过上面的调用关系,我们就可以大概看出一些数据传递关系。如下:
execute()向doInBackground()传递。
doInBackground()的返回值会传递给onPostExecute()。
publishProgress()向progressUpdate()传递。

要点:为了调用关系明确及安全,AsynTask类在继承时要传入3个泛型。第一个泛型对应execute()向doInBackground()的传递类型。第二个泛型对应doInBackground()的返回类型和传递给onPostExecute()的类型。第三个泛型对应publishProgress()向progressUpdate()传递的类型。
传递的数据都是对应类型的数组,数组都是可变长的哦。可以根据具体情况使用。[/color]

看这么多,可能不懂还更乱了,现在继承AsynTask来实现一个简单的异步子类。如下:
[/size]

public class BackgroundTask extends AsyncTask<Void,Void,Void> {

BGTaskListener mListener;

@Override
protected Void doInBackground(Void... params) {//后台处理任务
// TODO Auto-generated method stub
if(mListener!=null){
mListener.taskDoing();//具体操作在taskDoing中
}
return null;
}

@Override
protected void onPostExecute(Void result) {//任务完成
// TODO Auto-generated method stub
if(mListener!=null){
mListener.taskFinish();//完成通知
}
super.onPostExecute(result);
}

public void setTaskListener(BGTaskListener listener){
mListener=listener;
}
public interface BGTaskListener{
public void taskDoing();
public void taskFinish();
}
}

[size=medium] 就这么简单的应用一下先,也不知道应用方法对不对。在上节的下拉刷新中简单运用一下。[/size]

private QPullListener qplistener=new QPullListener() {

@Override
public void onRefresh() {
// TODO Auto-generated method stub
bgtask=new BackgroundTask();
bgtask.setTaskListener(bgtlistener);
bgtask.execute();
}
…
}

private BGTaskListener bgtlistener=new BGTaskListener() {

@Override
public void taskFinish() {
// TODO Auto-generated method stub
System.out.println(rcvdata);
qlv_list.completeRefresh(QListView.ISSUCCESS);//完成刷新
}

@Override
public void taskDoing() {
// TODO Auto-generated method stub
rcvdata=Http.read("http://www.baidu.com");//一个自定义网络类,获取百度首页数据
}
};

[size=medium] 运行效果就不贴了,一样的,注意看输出,限制一下网速试试?[/size]

[align=right][size=medium]相信自己——2017/05/18[/size][/align]
AJAX异步处理请求 异步登录 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。 这里有更加详细的简述以及Ajax原生的五个基本步骤及jq中的ajax 相对来说根更加全面一点 我们这儿能使用ajax实现异步刷新登录 引入js文件这儿就不用说,直接开始吧小伙伴们 js代码中的Login.ashx就是一般处理程序啦 $("#btnLogin").click(function () { ... 阅读详情

相关推荐

后台耗时程序处理 async_await 异步程序

1.采用background处理后台耗时程序,防止主线程阻塞,实时显示处理进度。 2.采用async_await 关键字实现异步程序编程,杜绝主线程处理耗时程序假死

后台异步处理

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33701564的博客 635

【OpenCV】复杂场景下的高精度圆检测实战(附完整代码)

本文针对OpenCV霍夫圆检测在复杂场景下易失效的问题,提出了一套基于轮廓分析的高精度圆检测实战方案。通过图像预处理、轮廓发现及多轮几何筛选(面积、周长、椭圆拟合、多边形逼近),有效排除噪声和类圆干扰物,显著提升复杂场景下的检测鲁棒性,并附完整可调参的Python代码实现。

weixin_29095587的博客 201

异步处理 (Asynchronous Processing) - 后端高并发方案

异步处理(Asynchronous Processing)是后端高并发方案中的一种重要技术。在面对大量请求和耗时操作时,异步处理能够显著提高系统的响应能力和吞吐量。

qq_43472841的博客 861

H3C无线控制器二层注册实战:从零配置到AP上线全流程(附常见问题排查)

本文详细解析了H3C无线控制器二层注册的全流程,从网络基础准备、AC核心配置到AP上线,重点阐述了CAPWAP隧道建立的关键步骤。文章提供了清晰的典型配置示例,并针对AP无法上线、状态异常等常见问题,给出了六种典型故障现象的排查思路与解决命令,帮助网络工程师快速定位并解决问题。

weixin_29214199的博客 547

某二级支行网络的设计与实现——配置脚本(1)

【代码】某二级支行网络的设计与实现——配置脚本(1)

u010311846的博客 578

php后台接口异步操作的实践

要解决这个问题,我这边需要把接口改成异步的,首先想到的是用多线程,把第三步发送邮件的操作放到工作线程里,这样当前线程可以及时返回结果给客户端,不能让用户等太长时间,因为他们是上帝。费解,怀疑是子线程里的操作没完成, 主线程返回,php进程退出了?这个接口完成第2步后, 与服务器建立非阻塞的socket连接,通过http协议告诉服务器:帮忙发个邮件啊,东西都放这了,我还有事,先走了,拜拜。但是,发送邮件的接口返回的是成功了,没有什么错误,而且,在接口最后,加上sleep(10)也不行,很奇怪。...

Tester_muller的博客 658

【迁移学习综述】

迁移学习的目标是将某个领域或任务上学习到的知识应用到不同的但相关的领域或问题中。迁移学习的研究来源于一个观测:人类可以将以前的学到的知识应用于解决新的问题,更快的解决问题或取得更好的效果。迁移学习被赋予这样一个任务:从以前的任务当中去学习知识(knowledge)或经验,并应用于新的任务当中。换句话说,迁移学习目的是从一个或多个源任务(source tasks)中抽取知识、经验,然后应用于一个目标领域(target domain)当中去。

afadgas的博客 4321

java 什么是异步_java异步是什么意思

本篇文章将对Java异步进行介绍,希望对大家有所帮助。异步:异步与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作。也就是说无论异步方法执行代码需要多长时间,跟主线程没有任何影响,主线程可以继续向下执行。例如:一条有分叉的水管,分叉口就是异步调用入口。A口为主线程,B口为辅助线程,当B口有东西塞住,并不影响A口通水。定义回调接口异步代码执行完后,结果往往需要一些...

weixin_28813763的博客 5525

2026零成本私有化:OpenClaw一键搭建Discord/Telegram智能机器人,数据不出本地,永久免费替代ChatGPT

如果内置的功能不能满足你的需求,你可以很容易地添加自己的自定义工具。public string Description => "查询指定城市的天气";// 调用天气API获取天气信息return $"city今天的天气是晴,温度25度";// 注册工具今天北京的天气怎么样?大模型的选择很重要:不要盲目追求大参数的模型。对于大多数场景来说,7B参数的模型已经足够用了,而且速度快,内存占用低。上下文长度不要设置太大:上下文长度越大,内存占用越高,推理速度越慢。

2601_94871597的博客 261

计算机视觉与深度学习 | 基于Matlab的多特征融合可视化指纹识别系统(附完整代码)

此系统展示了一个完整的指纹识别流程,实际应用中可以根据需求进一步优化算法,如改进方向场计算、增加脊线频率特征、使用更精确的匹配算法等。

尘世冰封的专栏 362

java后台异步处理

按我做的项目,简单记录,公司内部封装,其他地方不适用: ①在需要异步调用时,写好调用方法,并传异步处理需要的参数: EventProcessor.addRedPackagesEvent(id,name, roomId, giftId, giftNum,money); ②在“addRedPackagesEvent”中,写入以下代码,其中包含创建EventRedPackages对象并赋值;调

一个千万开发人员中的程序员 2万+

安装西门子TIA Portal V15.1提示先决条件不足如何处理?

安装TIA Portal STEP 7 Professional WinCC Professional V15.1提示先决条件不足,需要如何才能够满足安装条件呢? 1.硬件要求: 安装 STEP 7 Basic / Professional V15.1 的计算机必须至少满足以下需求: 处理器: Core i5-6440EQ 3.4 GHz 或者相当 内存: 16GB或者更多(对于大型项目,为32GB) 硬盘:SSD,配备至少50GB的存储空间 图形分辨率:最小 1920 x 1080 显示器:15.6"

Robot_PLC_HMI_Automation 2万+

QGIS 3.16 Python控制台避坑指南:从基础操作到高级技巧

本文为QGIS 3.16 Python控制台用户提供了一份全面的避坑指南与实战技巧。从理解独立Python环境配置、高效加载与遍历矢量数据,到调用处理算法、性能优化及构建可复用工具,系统讲解了如何避免常见错误并提升地理数据处理自动化的工作效率。

ggg99的专栏 418

npm install failed如何办?

上网搜索,说是网络配置不太对。按照如下几步,保证解决问题。在运行npm install指令时,出现如下错误。

xiezhipu的博客 880

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

异步处理[springboot16]

异步处理 什么是异步处理了? 异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步程序执行完即可执行。 异步处理有什么用? 当网站有大量数据要进行处理并反馈到前端,如果是同步处理,必须要等待后台运算完成,才能反馈给前端;此时如果用异步处理,先给前端一个反馈,在让后台慢慢处理数据。 怎样实现? 使用@Async 使用@EnableAsync @Async:用在异步方法上 //告诉spring这是一个异步的方法 @Asy

qq_44718582的博客 187

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

odoo16异步处理 queue_job

odoo queue_job第三方异步队列

Programmer_FuQiang的博客 479

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

php实现异步任务,php实现异步操作,后台执行耗时后台任务。

[php]

weixin_30843121的博客 724

Java 异步线程处理

Java 异步线程处理 在现代Java开发中,异步处理是提高程序性能和响应速度的重要手段。与传统的同步方法相比,异步处理允许程序在等待某些操作完成的同时执行其他任务,从而有效利用系统资源。本文将介绍Java中的异步线程处理,包括代码示例和简化流程图。 异步处理的概念 异步处理意味着某些操作不会立即返回,而是可以在其他操作进...

weixin_41294967的博客 200

一套万能通用的异步处理方案

????这是一个或许对你有用的社群????一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:《项目实战(视频)》:从书中学,往事中“练”《互联网高频面试题》:面朝简历学习,春暖花开《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题《精进 Java 学习指南》:系统学习,互联网主流技术栈《必读 Java 源码专栏》:知其然,知其所以然????这是一个或许...

weixin_44421461的博客 245

16 Redis 的异步机制

16 Redis 的异步机制前言一、Redis 的阻塞点4 类交互对象和具体的操作之间的关系:和客户端交互时的阻塞点:Redis 的第一个阻塞点:集合全量查询和聚合操作:Redis 的第二个阻塞点 :bigkey 删除操作Redis 的第三个阻塞点:清空数据库Redis 的第四个阻塞点:AOF 日志同步写Redis 的第五个阻塞点:从库加载 RDB 文件切片集群实例交互时的阻塞点二、可以异步执行的阻塞点三、异步的子线程机制总结 前言 命令操作、系统配置、关键机制、硬件配置等会影响 Redis 的性能,不仅

海陆云的博客 2万+

【16】异步爬虫的原理和解析

定义协程。

qq_73704268的博客 1834

RuoYi-Vue-Plus登录记录:异步处理

在传统后台管理系统中,登录记录处理往往采用同步方式,这会带来明显的性能问题: - **响应延迟**:用户登录时需要等待日志记录完成才能获得响应 - **数据库压力**:高并发场景下,频繁的日志插入操作会占用数据库连接资源 - **用户体验差**:登录操作响应时间变长,影响用户使用体验 RuoYi-Vue-Plus通过Spring事件机制和异步处理完美解决了这些问题,本文将深入解析其实现原理和最...

gitblog_00150的博客 927

Java 并发 —— CompletableFuture处理异步操作

文章目录Java 并发 —— CompletableFuture处理异步操作简介CompletableFuture 四种静态方法示例基础示例基础示例2项目实战需求核心源码单元测试 Java 并发 —— CompletableFuture处理异步操作 简介 CompletableFuture 四种静态方法 示例 基础示例 使用 CompletableFuture.supplyAsync() 定义要执...

Genius only means hard-working all one's life. 3250

Spring的深入浅出--16.Servlet3.0异步处理以及springMvc采用简单消息中间件进行异步处理

在Servlet3.0之前,Servlet采用Thread-Per-Request的方式处理请求。 即每一次Http请求都由某一个线程从头到尾负责处理。 如果一个请求需要进行IO操作,比如访问数据库、调用第三方服务接口等,那么其所对应的线程将同步地等待IO操作完成,而IO操作是非常慢的,所以此时的线程并不能及时地释放回线程池以供后续使用,在并发量越来越大的情况下,这将带来严重的性能问题,即便是...

moxiaolin的博客 339
上一篇: 15、ListView Item设置
下一篇: 17、网络图片加载
zdphpn
博客等级 码龄15年 2粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值