在开发中,一般耗时的操作我们都要放到子线程中去执行,而开启子线程的方式通常有几下几种:
一、直接new一个Thread
这种当然是最基本的写法,不必多说。
二、AsyncTask方式
AsyncTask内部封装了Thread和Handler。我们主要实现它的三个方法,
"doInBackground"、"onPostExecute"两个方法,其中"doInBackground"方法在子线程中运行,"onPostExecute"方法在主线程中运行。AsyncTask主要应用于在子线程中执行耗时操作的过程汇中同时在主线程中刷新界面的情况,AsyncTask在声明的时候需要声明三个参数,第一个参数为asyncTask执行开始传入的参数类型,如果声明为void,则AsyncTask的execute方法不需要传入任何参数,"onPostExecute"方法在"doInBackground"方法执行完毕后调用,后者的返回值为前者方法的入参,如果"doInBackground"方法执行过程中需要刷新界面,则我们需要重写AsyncTask的"onProgressUpdate"方法,并在"doInBackground"中调用此方法。
注:1.在安卓1.6之前AsyncTask内部是串行执行任务的,安卓1.6的时候开始采用线程池来处理并行任务,从安卓3.0开始,为了避免并发错误,AsyncTask又采用穿行的方式处理任务;
2.我们在需要AsyncTask停止正在执行的任务的时候(譬如退出APP或者Activity),可以调用它的"cancel"方法,这个方法需要传递一个boolean型的参数,用来表示是否需要中断当前正在执行的任务。
三、Timer方式
这个需要我们创建一个Timer的实例用来维护一个线程,然后创建一个TimerTask的实例,将需要运行的逻辑代码放到TimerTask的run方法中。
优点:
1.我们可以手动控制异步任务和异步线程的停止;
2.可以控制一个线程执行多个异步任务。
缺点:1、Timer内部维护着一个线程,有一个异步任务栈来来记录所有要执行的任务,所以多个任务在Timer中是顺序执行的,如果其中一个TimerTask执行时间过长,可能会使得此任务之后的任务不能按时执行,其中一个任务没有捕获抛出的异常的话,也会使得后面的任务无法执行;
2、Timer执行周期任务时依赖系统时间,Timer执行周期任务时依赖系统时间,如果当前系统时间发生变化会出现一些执行上的变化。
所以当我们使用Timer的时候一定要考虑好应用场景。