在Android中实现异步任务有两种方式: Handler 和 AsyncTask ;
这两种,有什么区别呢? Handler有什么优点或者缺点? AsyncTask有什么优点缺点呢?
可以这么说 :AsyncTask是Handler+Thread的良好封装,是一种较轻量级的异步类。它有一定的优势,同时也会有少许不足之处。
优点:1.操作简单,方便:因为是已经封装了的,提供一些良好的接口,所以操作起来更为简单。
2.过程可控:通过某些操作,可以使AsyncTask停止异步任务,所以便于控制。
缺点:1.不适用于多个异步任务。由于封装很好,在使用多个异步操作,同时需要对UI进行更新时,这个整个代码就会变得繁琐,复杂。
来说说 Handler
优点:1.结构清晰,功能明确。由于Handler是使用一个异步操作就写一个,所以一个Handler的功能很清晰。
2.适用于多个后台操作,它的优点正好弥补了AsyncTask的不足,在多个异步任务时,Handler的使用更为清晰,简单。
缺点:1.单个后台处理,代码量过多,冗余复杂。
下面来谈谈AsyncTask:
在继承AsyncTask这个类的时候会提供三个泛型参数: Params,Progress, Result
1.Params:启动任务时需要输入的参数 (可以是一个URL,也可以是一个Integer数据)
2.Progress:后台执行任务的进展情况(提供一个百分比)
3,.Result:后台返回结果的类型
步骤:
1.execute(Params...params) , 在代码中调用这个方法,实现异步任务的执行。
2.onPreExecute() , 在execute(Params...params)被调用之后执行,一般用来执行后台任务前对UI的标记
3.doInBackground(Params...params) , 在 onPreExecute() 完成后立刻执行,用于执行很费时的操作,这个方法将接收输入参数和返回结果。同时可以调用
publishProgress(Progress...values) 来更新信息。
4.onProgressUpdate(Progress...values) 在调用 publishProgress(Progress...values)时,此方法被执行,直接将信息更新至UI组件上。
5.onPostExecute(Result result) ,当后台结束之后,此方法被调用,计算结果作为参数传递到这个方法中,直接显示到UI组件上。
需要注意的:
1.异步任务必须在UI线程中创建,且一个任务实例只能调用一次,执行第二次会抛出异常
2. execute(Params...params)必须在UI线程中调用
3.不能手动调用 onPreExecute() ,doInBackground(Params...params) ,onProgressUpdate(Progress...values) ,onPreExecute(Result result) ,方法
4.不要在 doInBackground(Params...params) 方法中更新UI信息。
这几个函数的执行顺序图: