安卓事件分发、用户交互和界面绘制由UI线程处理,因此UI线程的性能直接影响到用户的感受。当在UI线程执行长时间的操作如网络请求、操作数据库等会阻塞整个UI线程,导致点击事件无响应、界面绘制停止,用户就会认为界面“卡死”了。当UI被阻塞约5s后会提示 "application not responding" (ANR)。因此UI线程有两条原则:
那么如何避免阻塞UI呢,我们使用了一下两种方法:
AsyncTask
AsyncTask对Thread和Handler进行了封装,我们直接使用其提供的方法即可在UI线程外实现异步操作。
doInBackground() 发生在单独线程,返回返回值传递给onPostExecute()onPreExecute(), onPostExecute(), onProgressUpdate()发生在UI线程。 IntentService
IntentService也是用于处理异步任务,调用startService(Intent)后会触发onHandleIntent(Intent),根据传递参数不同控制其执行不同的任务,处理结束后IntentService也会停止。