一、数据请求与UI界面更新事项
1.1 UI线程
Android在启动应用程序的时候,会为应用创建一个Main线程,这个线程负责将事件分派给相应用户接口的widget,其中包括drawing事件。除了事件分派之外,Main线程还负责应用与Android UI组件(例如, android.widget 和android.view 包)进行交互,因此Main 线程有时候也被称为UI线程。
1.2 ANR
Application Not Response简称ANR,程序无响应。
Android不会为每个组件实例创建单独的线程。运行于同一进程的所有组件均在 UI 线程(Main)中实例化,并且对每个组件的系统调用均由该线程进行分派。这样一来,响应系统回调的方法(例如生命周期回调方法)始终在进程的UI线程中运行。
如果应用在响应用户的操作的时候,在UI线程中执行了大量的耗时操作,比方说网络访问或数据库查询。这样做的后果势必会阻塞整个UI。一旦UI线程被阻塞,将无法分派任何事件,包括绘图事件。
如果UI线程被阻塞超过一定时间(目前 5 秒钟),就会出现我们常说的ANR。
1.3 如何在子线程中访问UI资源
既然ANR是由于在UI线程中执行大量耗时的操作引起的,那么我们在主线程中新建一个worker线程问题不就解决了么?事实上,这种方式的确能够解决一些问题,但是对于UI来说就不是那么灵光了,因为Android UI 线程并不是线程安全的。