Android使用后台线程提高用户体验
更新时间:2023-06-01 12:15:01 阅读量: 实用文档 文档下载
- Android线程推荐度:
- 相关推荐
Android使用后台线程提高用户体验
Android使用后台线程提高用户体验
<整理自网络>
当应用程序启动时,系统会为应用程序创建一个主线程(main)或者叫UI线程,它负责分发事件到不同的组件,包括绘画事件。完成你的应用程序与Android UI组件交互。例如,当您触摸屏幕上的一个按钮时,UI线程会把触摸事件分发到组件上,更改状态并加入事件队列,UI线程会分发请求和通知到各个组件,完成相应的动作。
单线程模型的性能是非常差的,除非你的应用程序相当的简单,特别是当所有的操作都在主线程中执行,比如访问网络或数据库之类的耗时操作将会导致用户界面锁定,所有的事件将不能分发,应用程序就像死了一样,更严重的是当超过5秒时,系统就会弹出“应用程序无响应”的对话框。显然这会造成很差的用户体验,所以我们需要保证主线程(UI线程)不被锁住,如果有耗时的操作,我们需要把它放到一个单独的后台线程中执行。
通过后台线程来提高用户体验的方式很多,一个最简单的方式就是在进行耗时操作的地方新开一个线程,用该线程来处理耗时操作,示例代码如下: view plainprint?
publicvoidonClick(Viewv){
newThread(newRunnable(){
publicvoidrun(){
//执行耗时操作
}
}).start();
}
起初,上面的代码似乎是一个很好的解决方案,因为它不会锁住用户界面线程。然面不幸的是,它违反了用户界面单线程模型:android的用户界面工具包不是线程安全的,只能在UI线程中操作它。android提供了几种方法来从其他线程访问UI线程。下面是一个较全面的列表:
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
Handler
一般情况下,我们会用Handler做UI线程的修改,示例代码如下: view plainprint?
privateProgressDialogprogressDialog; privateHandlermyHandler=newHandler(){ @Override publicvoidhandleMessage(Messagemsg){ progressDialog.dismiss(); super.handleMessage(msg); } }; publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(yout.main); progressDialog=newProgressDialog(MainActivity.this);
Android使用后台线程提高用户体验
progressDialog.setMessage("Loading…"); progressDialog.show(); newThread(newRunnable(){ @Override publicvoidrun(){ //这里作比较耗时的工作,暂时用线程休眠2秒作替代。
try{
Thread.sleep(4*1000);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
myHandler.sendMessage(myHandler.obtainMessage());
}
}).start();
}
首先显示一个ProgressDialog做界面友好提示,然后新开线程做耗时操作,最后调用handler的sendMessage,唤醒Handler。
除了上述的几种方法之外,1.5和更高版本的Android平台提供了一个实用类称为AsyncTask,简化了长时间运行的任务,需要与用户界面的交互。AsyncTask的目标是要为你的线程提供管理服务,示例代码如下: view plainprint?
privateclassDownloadFilesTaskextendsAsyncTask<Void,Void,Void>{
@Override
protectedVoiddoInBackground(Void…params){
//耗时操作,
try{
Thread.sleep(4*1000);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnnull;
}
@Override
protectedvoidonPostExecute(Voidresult){
//作UI线程的修改。
progressDialog.dismiss();
super.onPostExecute(result);
}
}
以下是AsyncTask的简要使用方法:
?您可以指定三个参数类型,泛型参数,进度值(执行过程中返回的值)和最终值(执行完
Android使用后台线程提高用户体验
返回的值)。
?该方法doInBackground()自动执行工作线程(后台线程)
?onPreExecute(),onPostExecute()和onProgressUpdate()都是在UI线程调用 ?由doInBackground返回的值()发送到onPostExecute()
?您可以在执行doInBackground()时调用publishProgress()然后在UI组程中执行onProgressUpdate()。
?您可以从任何线程随时取消任务
不管你是否使用AsyncTask,时刻牢记单一线程模型的两条规则:
1、不要锁住用户界面。
2、确保只在UI线程中访问android用户界面工具包中的组件。
正在阅读:
Android使用后台线程提高用户体验06-01
李白唐诗《将进酒》原文与注释通用10篇03-27
素质教育实施情况自评报告03-12
内科优质护理工作计划书03-23
有关幸福的格言02-07
消化道出血、急腹症试题10-30
监狱中层领导班子考核办法04-16
Fe3O4-PEDOT核壳微球的合成及其电磁波吸收性能05-16
我眼中的四季作文800字07-08
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 线程
- 后台
- Android
- 提高
- 体验
- 使用
- 用户
- 执行力培训教程 1
- 脑瘫如何进行诊断
- 会计英文常用词汇
- windows server 2003 安装IIS 6
- 无机化学(习题解答1)
- 成功学专家,陈安之-时间管理
- 北师大四年级数学上册期末测试卷1
- 2014年版专升本《教育理论》考点精解第二部分心理学
- 仁爱版英语七年级下册期末测试卷
- 在实践运用中实现创新
- 八年级下册心理健康教育计划
- 福建省闽清县2012-2013学年七年级生物上学期期末考试试题(无答案) 新人教版
- 导游分类和职责2
- 学习宝雅思必备资料全集
- 信息的收集和下载_教学设计
- 方钻杆旋塞阀-天合石油
- 某河滩地人工湿地工程建设项目环境影响报告表
- 边坡稳定性声发射监测
- 浅谈铁路企业加强成本控制
- 开县九龙山镇2010年度人口与计划生育工作总结