在Android中提供了一个异步任务的类AsyncTask,简单来说,这个类中的任务是运行在后台线程中的, 并可以将结果放到UI线程中进行处理,它定义了三种泛型,分别是Params、PRogress和Result,分别表示请求的参数、任务的进度和获得结果的数据。 1. 使用原因: * 是其中使用了线程池技术,而且其中的方法很容易实现调用 * 可以调用相关的方法,在开启子线程前和后,进行界面的更新 * 一旦任务多了,不用每次new新的线程,可以直接调用 2. 执行的顺序: onPreExecute()[执行前开启]—>doInBackground()—>onProgressUpDate()—>onPostExecute() 3. 执行过程: 当一个异步任务开启后,执行过程如下: * onPreExecute(): 这个方法是执行在主线程中的,这步操作是用于准备好任务的,作为任务加载的准备工作。建议在这个方法中做好初始化工作,弹出一个对话框。 * doInBackground(): 这个方法是执行在子线程中的,当onPreExecute()执行完后,会立即开启这个方法,在方法中可以执行耗时的操作,需要将请求参数传递进来,发给服务器,并将获取到的数据返回,数据会传给最后一步中:这些值都是将被放到主线程种,也可以不断的传给下一步的onProgressUpdate()中进行更新,可以通过不断调用publishProgress(),将数据(或进度)不断传递给onProgressUpdate()方法,进行不断更新界面 * onProgressUpdate(): 这个方法是执行在主线程中的,publishProgress()在被调用后才开启的这个方法,它在何时被开启是不确定的,执行这个方法的过程中,doInBackground()是仍在执行的,即子线程还在运行着 * onPostExecute(): 这个方法是执行在主线程中的,当后台的子线程执行完毕后才调用此方法。doInBackground()返回的结果会作为参数被传递过来,可以在这个方法中进行更新界面的操作 * execute(): 最后创建AsyncTask自定义的类,开启异步任务 4. 实现原理: 1. 线程池的创建: 在创建了AsyncTask的时候,会默认创建一个线程池ThreadPoolExecutor,并默认创建出5个线程放入到线程池中,最多可放128个线程,且这个线程池是公共的唯一一份。 2. 任务的执行: 在exexute中,会执行run方法,当执行完run方法后,会调用scheduleNext()不断的从双端队列中轮询,获取下一个任务并继续放到一个子线程中执行,知道异步任务执行完毕 3. 消息的处理: 在执行完onPreExecute()方法之后,执行了doInBackground()方法,然后就不断的发送请求获取数据,在这个AsycTask中维护了一个InternalHandler的类,这个类是继承Handler的,获取的数据是通过handler进行处理和发送的。在其handlerMessage方法中,将消息传递给onProgressUpdate()进行进度的更新,也就可以将结果发送到主线程中,进行界面的更新了 5. 需要注意的是: * 这个AsyncTask类必须由子类调用 * 虽然是放在子线程中执行的操作,但是不建议做特别耗时的操作,如果操作过于耗时,建议使用线程池TreadPoolExecutor和FutureTask
新闻热点
疑难解答