关于Android的UI非线程安全

来源:互联网 发布:电脑网络节点 编辑:程序博客网 时间:2024/05/17 06:53

今天偶尔在网上看到这边文章 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等变量的问题,这样就存在线程安全的隐患。

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


原创粉丝点击