AsyncTask 异步任务
在Android中对于一些耗时的操作,一般都不会放在UI线程中运行,会新建一个子线程去做。 Android默认UI线程阻塞超过20秒则会引发ANR异常。但是如果开启太多的子线程,这就会给系统带来巨大的负担,随之也会带来性能方面的问题。在这种情况下我们就可以考虑使用类AsyncTask来异步执行任务,不需要子线程和handler,就可以完成异步操作和刷新UI。
AsyncTask是一个抽象类,通常用于被继承,继承AsyncTask时需指定以下三个泛型参数:
- Params:启动任务执行的输入参数类型,对应的是调用自定义的AsyncTask的类中调用excute()方法中传递的参数。如果不需要传递参数,则直接设为Void即可。
- Pregress:后台任务完成的进度值的类型;
- Result:后台执行任务完成后返回结果的类型;和doInBackground()方法的返回值类型保持一致。
实现AsyncTask方法:
- doInBackground(Params…): 后台线程将要完成的任务,返回值类型和Result保持一致,若无就Void
- onProgressUpdate(Progress… progress):无返回值类型。参数:若无就传递Void;若有,就可用Progress
- publishProgress(Params… params):在执行此方法的时候会直接调用onProgressUpdate()
- onPostExecute(Result result) :无返回值类型。参数:和Result保持一致。
- onPreExecute():无返回值类型。不传参数
对于AsyncTask有以下几个规则:
1. Task的实例必须在UI thread中创建
2. execute方法必须在UI thread中调用
3. 该task只能被执行一次,否则多次调用时将会出现异常
4. 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(), onProgressUpdate(Progress…)这几个方法,而是由Android系统负责调用;