一、为什么要引入AsyncTask?
AsyncTask异步任务类,Android封装这样一个类是要简单解决UI和后台线程交互的问题。
二、AsyncTask使用
它是一个抽象类,所以使用时需要创建一个子类来继承它。在继承时可以为AsyncTask指定三个泛型参数分别是:
Params: 在执行AsyncTask时需要传入的参数,可以用于在后台中使用。
Progress: 如果前台需要在界面上显示进度,那个这里指定的泛型作为进度的单位。
Result: 任务执行之后,如果需要对结果进行返回,这里指定的泛型作为返回值类型。
比如:class DownloadTask extends AsyncTask<Void,Integer,Boolean>
在使用中,经常会重写AsyncTask中的几个方法:
1、onPreExecute()
后台任务开始执行之前调用。用于界面上的初始化。运行在主线程。比如可以在这里创建对话框。
2、doInBackground(Params...)
这个方法是运行在子线程中,在这里进行一些耗时操作。任务完成可以通过return语句来将任务的执行结果返回。如果AsyncTask的第三个参数是Void那么可以不返回任何的结果。如果想要更新UI,可以调用publishProgress(Progress...)来实现。
3、onProgressUpdate(Progress...)
当后台任务中调用了publishProgress(Progress...)的方法后,该方法就会很快被调用。方法中的参数就是后台传递过来的。这个方法中可以UI操作,这个方法是运行在主线程中的。
4、onPostExecute(Result)
当后台任务执行完并通过returen返回结果,该方法很快会被调用。返回的数据会通过参数传递过来。该方法也是运行在主线程中,可以进行UI操作。比如这里可以关闭进度对话框。
启动任务:new DownloadTask().execute();
可以看出AsyncTask异步任务类的简便之处在于不需要我们创建Handler发送消息处理消息。调用publishProgress()就可以从子线程切换到主线程。
三、面试题:在项目中使用AsyncTask 会有什么问题么?
四、AsyncTask与内存泄漏
在Java中,非静态的内部类和匿名内部类会隐式的持有外部类的引用,这就会导致外部类无法被回收,进而导致外部类持有的很多资源无法回收,就会导致内存泄漏。所以如果创建非晶态的内部类继承AsyncTask,就会有内存泄漏的问题。