AsyncTask

来源:互联网 发布:怎么快速提升淘宝星级 编辑:程序博客网 时间:2024/04/18 11:41

一、为什么要引入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,就会有内存泄漏的问题。

参考:http://www.jianshu.com/p/3b839d7a3fcf

原创粉丝点击