我们在使用手机的时候,经常会遇到一个问题:先是卡死,然后跳出该程序无响应,是否关闭的提示(当然有可能是我们手机性能太差=。=)这是因为线程的阻塞引起的,在这里我讲述一下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事件中引用。

最新文章

  1. @RequestMapping映射请求
  2. win10显示此电脑
  3. Ajax前台与Mod_python后台应用示例
  4. 转载--Ubuntu设置环境变量
  5. 【STL】帮你复习STL泛型算法 一
  6. js中的ajax的运用
  7. POJ 2531 Network Saboteur 位运算子集枚举
  8. Aspnet MVC 异步调用
  9. NOI 2005 维修数列
  10. select省市联动选择城市 asp.net mvc4
  11. c/c++测试函数的运行时间(八种方法)
  12. java面向对象理解
  13. Prometheus 到底 NB 在哪里?- 每天5分钟玩转 Docker 容器技术(84)
  14. 微信公众号开发C#系列-4、获取接口调用凭证
  15. Shader 入门笔记(一) 如何学习shader
  16. Windows重启显卡驱动热键说明
  17. WP8 调用webservice 错误 The remote server returned an error: NotFound 解决
  18. ssh 管理 linux登录远程服务器
  19. Linux基础命令---添加组groupadd、删除组groupdel
  20. 【bat】通过for循环复制一张图片100次

热门文章

  1. theano中对图像进行convolution 运算
  2. Linux内核监控模块-3-系统调用的截获
  3. 在debug模式下运行不报错,换到release模式下报找不到某某库或文件的错。。解决办法
  4. 【uva10917】Walk Through the Forest (最短路)
  5. MyEclipse6.5安装SVN插件的三种方法z
  6. 利用rowid更新单表
  7. 【HDOJ】1422 重温世界杯
  8. 详解Linux配置iSCSI方法
  9. BZOJ1610: [Usaco2008 Feb]Line连线游戏
  10. MYSQL仅仅向某个字段进行插入