今天偶尔在网上看到这边文章 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等变量的问题,这样就存在线程安全的隐患。
其实计算机科学中很多基本的原理都是相通的,无非是变换一个实现的角度而已,遇到问题需要多思考一下!