关于Android的UI非线程安全

今天偶尔在网上看到这边文章 http://hold-on.iteye.com/blog/991403

1、我们都知道,在Android的开发中,非UI线程不能操作UI线程中的控件,即UI是非线程安全的;

2、但是在工作线程(非UI线程)中调用ProgressBar控件的setProgress(int count)方法时,程序运行并

    不会出现异常,

3、但是如调用setBackGround(int color)或者setVisibility(int v)时,程序运行后出现异常

4、第一和第三点说的通,但是第二点不能理解

问题:谁能给“在工作线程中操作主线程UI”下个定义,比如上面的setProgress是操作UI吗?一般性判定原则是什么?

其实这是一个典型的多线程的安全问题,当然在Android中也不能列外。在大多数应用程序中,我们通常会有一个UI线程,即Android的UI Looper线程,还有一个通讯线程,负责和服务器端的交互。

那么为什么在非UI线程中可以调用ProgressBar呢?因为ProgressBar控件属于非UI线程的变量,它为非UI线程所有,不存在多线程共享数据的问题;而在非UI线程中调用setBackGround(int color)等方法,就涉及到调用UI线程的Context等变量的问题,这样就存在线程安全的隐患。

其实计算机科学中很多基本的原理都是相通的,无非是变换一个实现的角度而已,遇到问题需要多思考一下!


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值