整个过程有点复杂,认真理解下,还是觉得设计得挺好的。
异步操作 AsyncTask
对于耗时较多的操作(如网络操作等)因为会消耗时间而使程序阻塞,那么应该采用异步线程才进行。
实现一个继承AsyncTask 异步操作的类。覆盖doInBackground方法
采取不直接调用所要进行的操作,而是在doInbackground中实现。
实例化一个AsyncTask的继承类,然后调用其execute()方法即可。那么耗时操作就在新的线程中执行了,如果遭遇阻塞将不会影响到UI线程。
AsyncTask:
execute()
onPreExecute():在UI线程中执行,进行异步线程执行之前的UI准备工作
onPostExecute():在UI线程中执行,那么可以控制UI控件
doInBackground():无法控制UI,因为它是在另外一个线程中执行的,在这个方法里我们执行耗时操作,并通过调用publicProgress()进而调用onProgressUpdate()方法,从而更新UI。
onProgressUpdate():在异步任务执行过程中对UI进行修改
生成AsyncTask对象之后,执行execute(),首先执行的是onPreExecute(),然后是doInBackground(),中间会调用onProgressUpdate(),最后是onPostExecute()。其中,doInBackground()是在一个新的进程中执行的。
在doInBackground()调用publishProgress()将会调用onProgressUpdate(),从而更新UI。从这点看,publishProgress的作用是进程间通信。
doInBackground()的参数是来自调用execute()得到的参数,也是AsyncTask三个参数中的第一个。
doInBackground()的返回值由AsyncTask的第三个参数决定,这个返回值会作为onPostExecute()的参数。
onProgressUpdate()的参数来自publishProgress()的参数,由第二个类型参数定义