今天在写代码时,再一次碰见AsyncTask,于是决定总结一下AsyncTask的相关知识点
Android 1.5版本引入了一个AsyncTask抽象类,使用它可以非常灵活的从子线程切换到UI线程。
为什么要使用AsyncTask:
在Android中实现异步任务机制有两种方式,Handler和AsyncTask
Handler需要为每一个任务创建一个新的线程,然后通过Handler实例对象,向UI线程发送消息,完成界面更新,缺点:代码相对复杂,多个任务同时执行,不易对线程进行灵活的控制,为了简化操作,提供了android.os.AsyncTask,它使异步创建任务变得更加简单,不需要写线程和Handler实例就可完成任务。
基本用法
参数说明:
抽象类,需要自定义一个类,继承AsyncTask,在继承时,需要指定三个泛型
1.params(启动任务执行的传入参数):执行AsyncTask时传入的参数,用于在后台任务中使用
2.progress(后台执行任务的进度):后台任务执行时,如果需要展示当前进度,就要指定泛型作为进度单位
3.result(后台执行任务返回的结果):任务执行完毕后,需要对结果进行返回接收,就需要指定该泛型
重写方法:
1.onPreExecute():execute()被调用后,后台任务开始执行前调用,用于进行一些初始化界面或者数据的操作。
2.doInBackground(Params...):该方法中的所有代码运行在子线程中,唯一一个运行在子线程中的方法,因此,所有耗时操作都应在此方法中处理。任务一旦完成,就可以通过return将任务执行结果返回,如果AsyncTask第三个泛型参数是Void,则可以返回执行结果。注意:因为是运行在子线程中的方法,所以此方法中是不能进行UI界面修改的操作。如果要进行UI界面修改的操作,可以调用publishProgress(Progress...)方法来完成。
3.onProgressUpdate(Progress...):在后台任务中调用了publishProgress(Progress...)方法,该方法就会很快被调用,方法的参数就是在doInBackground()方法传递过来的,可对UI进行操作
4.onPostExecute(Result):当后台任务执行完毕,并通过return返回数据时,该方法很快会被调用,返回的数据会作为参数传递到此方法中,也可用返回的数据进行UI修改的操作。
启动AsyncTask任务:new MyAsyncTask().execute(Params...params);
注意事项:
1.创建AsyncTask实例对象以及execute()方法的调用必须在UI线程中
2.不能在doInBackground()方法中修改UI组件,因为该方法运行在子线程中
3.一个任务实例只能执行一次,执行第二次会报错
网友评论