第10讲- UI线程阻塞及其优化
第10讲UI线程阻塞及其优化
、UI
阻塞demo
(首先在activity_main.xml中放置两个button,分别命名为button1,button2)
//首先设置一个button1用来进行动画演示
Button button1=(Button) findViewById(R.id.button1);
//位移方向移动的动画
TranslateAnimation animation=new TranslateAnimation(100,150, 50, 100);
animation.setDuration(2000); //设置持续的时间,单位为微秒
animation.setRepeatCount(10); //设置重复的次数
button1.setAnimation(animation);
//设置一个button2进行耗时操作sleep
Button button2=(Button) findViewById(R.id.button2);
button2.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
try {
Thread.sleep(5000); //设置线程耗时操作,单位ms
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
点击button2之后,button1的移动发生卡死,发生UI线程阻塞。
当一个应用程序启动之后,Android系统会为这个应用程序创建一个主线程。这个线程非常重要,它负责渲染视图,分发事件到响应监听器并执行,对界面进行轮询监听。因此,一般也叫做“UI线程”。
Android系统不会给应用程序的多个元素组件,建立多个线程来执行。一个视图(activity)中的多个view组件运行在同一个UI线程当中。因此多个view组件的监听器的执行可能对相互影响(即是UI线程阻塞)。
、UI阻塞解决方案:创建一个新线程
Button button2 = (Button)findViewById(R.id.button2);
button2.setOnClickListener(new OnClickListener(){
public void onClick(View v) {
new Thread(newRunnable() { //创建一个新线程
public void run() {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
});
将耗时操作放在一个新的线程里面进行操作,利用new Thread().start()打开新的线程。
此时因为没有更改view,所以不会报错。但是一旦我们在UI线程外修改了view组件的属性,则会报错。
安卓官方规定的两个规则:
There are two simple rules to Android’ssingle thread model:
Do not block the UI thread. 不要阻塞UI线程
Do not access the Android UI toolkit from outside of the UIthread. 不要再UI线程之外的其他线程中,对视图当中的组件进行设置
违反rule2会报异常:Only the original thread that created aview hierarchy can touch its views.
、在其他的线程中修改UI线程中的组件
方法a:view.post
将需要进行view组件修改的程序部分放在v.post(new Runnable() { }中的run()方法进行即可。
Buttonbutton2 = (Button) findViewById(R.id.button2);
button2.setOnClickListener(newOnClickListener() {
publicvoid onClick(final View v) {
newThread(newRunnable() {
publicvoid run() {
try {
Thread.sleep(5000); //设置线程耗时操作,单位ms。在新线程中进行耗时操作
} catch (InterruptedException e){
e.printStackTrace();
}
} .
}).start();
intsum=10; //假定通过耗时操作计算处理的得到的一个值
v.post(newRunnable() {
public void run() {
TextView textView=(TextView) v; //在post中进行view修改操作
textView.setText(""+10);
}
});
}
});
post原理:通过view.post在任务队列中添加一个任务Runnable对象,UI thread在轮询过程中会检查任务队列中是否有任务,有则执行(如下图所示)。此时任务队列中的修改view组件的操作是在UI线程中执行的,则不违反上面的rule2.
方案a:post方法,可读性差,维护性差。
原理是在新线程中进行耗时操作,在post中进行view修改操作。
方法b:AsyncTask (异步任务)
AsyncTask允许你在你的用户接口上执行异步工作。他在工作者线程中执行阻塞操作,然后将结果发布给 UI线程,不需要你自己处理线程或者 handler。
为了使用他,你需要继承 AsyncTask并且实现他的 doInBackground()回调方法,他在一个后台线程池中运行。为了更新你的 UI,你需要实现 onPostExecute()方法,他传递来自 doInBackgroud()的结果且在 UI线程中运行。所以你可以安全的更新你的 UI。你可以在 UI线程通过 execute()来运行你的任务。
privateButton button2 = null;
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//为button1添加一个动画操作
Buttonbutton1 = (Button) findViewById(R.id.button1);
//位移方向移动的动画
TranslateAnimationanimation = new TranslateAnimation(0,150,0,0);
animation.setRepeatCount(30); //设置重复的次数
animation.setDuration(2000); //设置持续的时间,单位为微秒
button1.setAnimation(animation);
button2= (Button) findViewById(R.id.button2);
button2.setOnClickListener(newOnClickListener() {
publicvoid onClick(final View v){
newDownloadImageTask().execute();
}
});
}
privateclass DownloadImageTask extends AsyncTask<String, Void,Integer> {
protected IntegerdoInBackground(String... urls) {
try{
Thread.sleep(5000);
}catch (InterruptedException e) {
e.printStackTrace();
}
intsum=10;
returnsum;
}
protected voidonPostExecute(Integer sum) {
button2.setText(""+sum);
}
}
第10讲- UI线程阻塞及其优化的更多相关文章
- Android Studio学习随笔-UI线程阻塞以及优化
我们在使用手机的时候,经常会遇到一个问题:先是卡死,然后跳出该程序无响应,是否关闭的提示(当然有可能是我们手机性能太差=.=)这是因为线程的阻塞引起的,在这里我讲述一下UI线程,一般处理程序会在UI线 ...
- jQuery同步Ajax带来的UI线程阻塞问题及解决办法
俗话说不作死就不会死,今天作死了一回,写了一个比较二逼的函数,遇到了同步Ajax引起的UI线程阻塞问题,在此记录一下. 事情起因是这样的,因为页面上有多个相似的异步请求动作,本着提高代码可重用性的原则 ...
- jQuery同步Ajax带来的UI线程阻塞问题及解决方法
遇到了同步Ajax引起的UI线程阻塞问题,在此记录一下. 事情起因是这样的,因为页面上有多个相似的异步请求动作,本着提高代码可重用性的原则,我封装了一个名为getData的函数,它接收不同参数,只负责 ...
- jQuery同步Ajax带来的UI线程阻塞问题
一.需求 在调ajax接口的时候因为有时间延迟,想要做一个loading加载的效果,等数据返回时再把loading的效果去掉. 所以我在调ajax的代码块前面加了显示loading效果的代码,ajax ...
- Jquery ajax 同步阻塞引起的UI线程阻塞的坑(loading图片显示不出来,layer.load延迟)
今天想做一个点击地市用ajax重新获取数据刷新页面功能,因为ajax属于耗时操作,想在获取数据且加载页面时显示加载遮罩层,结果发现了ajax的好多坑. 例如如上栗子,我想点击按钮让遮罩层显示,ajax ...
- Javascript之UI线程与性能优化
在浏览器中,Javascript执行与UI更新是发生在同一个进程(浏览器UI线程)中的.UI线程的工作基于一个简单的队列系统,任务会被保存到队列中直到进程空闲时被提取出来执行.所以Javascript ...
- [ionic开源项目教程] - 第10讲 新闻详情页的用户体验优化
目录 [ionic开源项目教程] 第1讲 前言,技术储备,环境搭建,常用命令 [ionic开源项目教程] 第2讲 新建项目,架构页面,配置app.js和controllers.js [ionic开源项 ...
- 通过使用Web Workers,Web应用程序可以在独立于主线程的后台线程中,运行一个脚本操作。这样做的好处是可以在独立线程中执行费时的处理任务,从而允许主线程(通常是UI线程)不会因此被阻塞/放慢。
Web Workers API - Web API 接口参考 | MDNhttps://developer.mozilla.org/zh-CN/docs/Web/API/Web_Workers_API ...
- C#.NET使用Task,await,async,异步执行控件耗时事件(event),不阻塞UI线程和不跨线程执行UI更新,以及其他方式比较
使用Task,await,async,异步执行事件(event),不阻塞UI线程和不跨线程执行UI更新 使用Task,await,async 的异步模式 去执行事件(event) 解决不阻塞UI线程和 ...
随机推荐
- ubuntu14.04 + cocos2d-x-3.6 + eclipse发布android
cocos2d-x-2.2.6版本 :http://www.cnblogs.com/weishuan/p/4698470.html 接下来是3.6了 ,准备好下面四个东东,我把这些都放在XXX/App ...
- 小米路由器mini搭建个人静态网站的方法
小米路由和小米路由mini从本质上来说差距就在1T的硬盘上,其它并没有明显差别,但是功能却差很多,例如:小米路由有自带的LAMP模式,而小米路由mini则没有,换句话说,其实这个功能是被阉割了,仔细研 ...
- 使用python监听、模拟鼠标键盘事件
最近守望职业选手疑似开挂事件挺热闹的,在下小菜一枚,并不能从视频中看出端倪.看了一些关于外挂的讨论,自动点射和压枪只需在鼠标驱动上做些改动即可,自瞄或其他高级功能则需要读内存或修改游戏文件,检测也更容 ...
- hdu 3722
单词间形成环,求最大值,,KM,,,,, #include<stdio.h> #include<string.h> #define N 210 #define inf 0x3f ...
- 自己实现一个SQL解析引擎
自己实现一个SQL解析引擎 功能:将用户输入的SQL语句序列转换为一个可运行的操作序列,并返回查询的结果集. SQL的解析引擎包含查询编译与查询优化和查询的执行,主要包含3个步骤: 查询分析: 制定逻 ...
- Laravel Eloquent ORM
Eloquent ORM 简介 基本用法 集体赋值 插入.更新.删除 软删除 时间戳 查询范围 关系 查询关系 预先加载 插入相关模型 触发父模型时间戳 与数据透视表工作 集合 访问器和调整器 日期调 ...
- oracle卸载Oracle Clusterware(转载)
1.脚本自动删除 切换到root用户 $Su – root #cd $ORA_CRS_HOME/install 1.执行rootdelete.sh脚本 # ./rootdelete.sh 2.执行ro ...
- linux服务器加入windows域时报错Ticket expired
[root@rusky]# net ads join -U administrator Enter administrator's password: kinit succeeded but ads_ ...
- Python安装后在CMD命令行下出现“应用程序无法启动.............”问题
问题存在之一:系统是刚刚重做的精简版服务器系统(阉割版) AN就是在阿里云上刚开的Windows Server 2008 系统上碰到的 吓尿了都 症状: 正常安装python环 ...
- .NET开发人员必须知道的八个网站
对于不熟悉.NET技术的朋友,需要说明一下,.NET提供了一个平台和一些相应的工具,.NET开发人员可以使用它们来在开发Windows桌面,互联网,甚至是手持移动设备上构建极富交互性的应用.很有可能你 ...