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
- AsyncTask
- ASyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- IT行业与风投
- JavaScript中的数组创建
- Spring Boot模板引擎
- mybatise一对多关系查询时不能直接分页
- [LeetCode-Algorithms-147] "Insertion Sort List" (2017.12.21-WEEK16)
- AsyncTask
- iOS——中使用多个Target去管理环境版本
- C# NPOI MO工具的应用(excel,ppt,doc)
- react 随手记
- node.js全局对象和全局变量
- 【重磅发布】《2017开发者调查报告》代码谱写传奇,深度揭秘中国开发者现状
- C++ 单链表基本操作
- 自学Android开发之从虚拟机中导出已安装的Android模拟器
- AS 修改默认继承AppCompatActivity