Android Studio学习随笔-UI线程阻塞以及优化
我们在使用手机的时候,经常会遇到一个问题:先是卡死,然后跳出该程序无响应,是否关闭的提示(当然有可能是我们手机性能太差=。=)这是因为线程的阻塞引起的,在这里我讲述一下UI线程,一般处理程序会在UI线程中执行耗时操作,这回导致UI线程阻塞,当UI线程阻塞,屏幕会出现卡死,用户体验会变得非常差,当线程阻塞超过5s,android系统可能进行干预,弹出对话框询问是否关闭。那如何解决呢?
解决方案一:创建一个新线程
我在UI视图中创建了一个button和一个textView
Button button=(Button)findViewById (R.id.button);
TextView textView=(TextView)findViewById(R.id.textView); TranslateAnimation animation=new TranslateAnimation(0,200,0,0);
animation.setRepeatCount(3);
animation.setDuration(2000);
textView.setAnimation(animation);
//这里我让textView在进入app时进行移动动画 button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(final View v) {//监听button的点击
new Thread(new Runnable() {//创建一个新线程
@Override
public void run() {
try {
Thread.sleep(5000);//在这里我让线程进行耗时操作
}
catch (InterruptedException e){
e.printStackTrace();
}
}
}).start();
}
});
上面的代码我创建一个新的线程来实现耗时,但是实际过程中进行的不可能只是一个耗时操作,让我们在新线程中加两句话,TextView view=(TextView)v;view.setText(""+100);(获取到当前控件,并将其文字设置成100)现在让我们再来试试这个程序,这个时候程序又报错了
Only the original thread that created a view hierarchy can touch its views.
翻译成中文就是:只有创建view的那个线程才能对其进行修改。
其实谷歌有两条建议,也可以说是规矩
there are simply two rules to Android's single thread model:
Do not block the Ui thread//不要阻塞UI线程
Do not access the Android UI toolkit from outside the UI thread//不要在UI线程外的其他线程对视图中的组件进行设置
那么很多人就有疑问了,这不是矛盾了吗?谷歌也为我们提供了解决方案
解决方案一:view.post
上面代码出错是因为我们在UI之外的线程调用了UI控件;那么现在,我们在try{}catch(){}语句后增加一下代码
v.post(new Runnable() {
@Override
public void run() {
TextView view=(TextView)v;
view.setText(""+sun);
}
});
这段代码将我的语句提交到了UI线程中;但是view.post也有一些缺点
冗余,可读性差,维护性差
为此官方也提供了另外一种解决方法
解决方法二:AsyncTask
AsyncTask和post方法大同小异
private class DownloadImageTask extends AsyncTask<String ,Void,Integer>{
protected Integer doInBackground(String...urls){
try{
Thread.sleep(5000);
}catch (InterruptedException e){
e.printStackTrace();
}
int sun=100;
return sun;
}
protected void onPostExecute(Integer sum){
button2.setText(""+sum);
}
}
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new DownloadImageTask().execute();
}
});
我们现在外部创建一个方法,然后在button的onClick事件中引用。
Android Studio学习随笔-UI线程阻塞以及优化的更多相关文章
- 第10讲- UI线程阻塞及其优化
第10讲UI线程阻塞及其优化 .UI 阻塞demo (首先在activity_main.xml中放置两个button,分别命名为button1,button2) //首先设置一个button1用来进行 ...
- Android Studio学习随笔-模拟耗时操作(sleep)
在这里我申明一点,因为我是挂着VPN去YOUTOBE看的尚学堂的高明鑫老师讲的Android基础学习视频,有些东西他没有讲,而我也没办法,只能等两个星期后学校请老师来的时候进行询问,当然我也会将一些问 ...
- Android Studio学习随笔-移动动画的实现
在上一篇博客我已经讲述了三种事件的实现方法,而现在我用复用方法来实现控件的自动移动,当然要实现控件的移动,先得在activity_main.xml文件中放置一个控件,此处我放置的是一个button控件 ...
- Android Studio学习随笔-基本事件(点击)
最常见的点击事件有三种创建方法,在MainActivity.java的onCreate函数(在启动程序是优先运行的程序)中创建setOnClickListener(动态运行)(最常见) protect ...
- Android Studio 学习 - 基本控件的使用;Intent初学
Android Studio学习第三天. 今天主要学习 1. RadioButton.CheckBox.RatingBar.SeekBar等基础控件的使用. 结合Delphi中相类似的控件,在这些基本 ...
- 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 ...
随机推荐
- 横向浅谈移动技术------( 原生,混合,web --- 谁能问鼎移动开发的明天)
目前移动互联网基本采用了NativeApp.WebApp.HybridApp三种开发模式,很难说这三种模式那种更优越,目前的情况可以说是三分天下吧,不同的开发者可以根据自己的实际情况选择不同的开发模式 ...
- (转载)KL距离,Kullback-Leibler Divergence
转自:KL距离,Kullback-Leibler Divergence KL距离,是Kullback-Leibler差异(Kullback-Leibler Divergence)的简称,也叫做相对 ...
- jsp页面传参到action出现乱码
jsp页面以连接方式传参到后台action时( <a href="http://localhost:8080/SocialBook/pages/bookdetail?book.id=& ...
- MySQL的if,case语句
IF表达式 IF(expr1,expr2,expr3) 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为exp ...
- UE编辑器加载格式化代码插件astyle
UE 的格式化功能不强,自带的astyle版本陈旧,一般采用开源工具astyle来实现代码格式化. 1. 首先下载最新的astyle,因为ue自带的astyle版本太老,不支持空格.中文名等. 2. ...
- 我的第一份vim程序
vim太好用了吧!!!根本停不下来啊! devc++再见! /*==================================================================== ...
- Linux下把U盘格式化为fat32
在linux下也是支持fat32的,如果U盘中了病毒可以插入linux系统进行格式化比较安全,下面介绍如何在linux下把u盘格式化为fat32的方法 一.执行fdisk -l查看linux设备,我的 ...
- 初遇ping++
运行遇到的bug java.lang.NoClassDefFoundError: Failed resolution of: Lcom/pingplusplus/android/PingppLog; ...
- Hibernate(四)基本映射
映射的概念 在上次的博文Hibernate(三)Hibernate 配置文件我们已经讲解了一下 Hibernate中的两种配置文件,其中提到了两种配置文件的主要区别就是XML可以配置映射.这里提到的映 ...
- 在MacOSX下用管理员权限打开App应用程序
最近但疼的事情比较多,特别是升级了10.9以后. 难怪10.9会免费,它喵的当我们所有人都是测试开发者,那我们做实验,到处都是BUG...虽然是这么吐槽了,但是实际上也没有特别大的,能够影响到我的生活 ...