Android 异步任务AsyncTask的使用
来源:互联网 发布:linux ssh端口转发 编辑:程序博客网 时间:2024/04/25 11:26
异步任务AsyncTask的使用
异步任务类AsyncTask,通俗点说就是可以帮助我们用线程将两段代码不同步的进行,一般的是用来更新UI界面的,(我们知道在子线程中是不能更新UI的,但是在AsyncTask中是可以更新的,不需要将Handler和子线程就可以完成异步操作并且更新UI界面了),当然其他的耗时操作也可以放在里面进行,比如说进行网络的请求或者是数据库的存取之类的...刚接触这个不久,自己也就用过一次,所以对这个不是很熟悉,如果有什么不对的地方还希望各位给小达指出~~~~~,关于异步任务类的内部实现原理,可以参考chenshaoyang0011
由于我是在做一个天气App的过程中接触到的,所以把里面的源码拿过来做实现的例子.异步任务类是一个抽象类, 在继承了这个抽象类之后,直接在UI线程中调用execute()方法就能实现异步了,AsyncTask<Void,Void,Void>里定义了三种泛型类型,分别是
Params : 在UI线程中实例化继承了异步任务类的类之后,调用execute()时里面放入的参数类型,也就是doInBackground(的 参数类型.这个参数实际上是一个varags,例如String[] , int[] 等等,比如在继承的时候AsyncTask<String,Void,Void>,这样写,那么在doInBackground(String... params)应该对应起来写,实际上这个params应该是一个String类型的数组.
Progress : 该参数是在doInBackground()方法执行过程中,不断的产出的参数,相当于异步任务执行进度,为publishProgress()和onProgressUpdate()的参数类型.这个参数和上面的也也一样,也是类似于String[] 的一个东西.
Result : doInBackground()方法的返回值类型.就只有这个参数稍微正常了点,是String 就是 String .
使用前先自定义一个类继承它,里面有四个函数:
一. doInBackground(Void... params) 这个函数是最主要的,即后台主要运行的代码放在里面,可以执行耗时的方法,其中的参数是可变的,在后面会讲到,这里因为在前面继承AsyncTask的时候是
public class DatabaseAsyncTask extends AsyncTask<Void,Void,Void> {这个样子继承的,所以doInBackground里面的参数也是Void类型.
二. onPreExecute() 此函数在UI线程中调用execute()后,在doInBackground()方法执行之前运行.通过命名也能看的出来哈.
三. onProgressUpdate(Void... values) 在publishProgress()被调用以后执行,publishProgress()用于更新进度.
四. onPostExecute(Void aVoid) 运行在ui线程中,在doInBackground()执行完毕后执行.
以上就是我们在运用异步任务类的时候会接触到的几个函数了,将我们需要执行的任务分配一下就能达到想要的目的.下面就结合实例来看看异步任务类怎么发挥作用的...
先在MainActivity的OnCreate()方法里面实例化了一个继承了AsyncTask的DatabaseAsyncTask类,直接调用databaseAsyncTask.execute()方法,让其在后台查询数据库中的数据.上代码...
/**
*这部分就是在activity中的两行代码.用起来还是很简单的哈
*/
DatabaseAsyncTask databaseAsyncTask = new DatabaseAsyncTask (getApplicationContext(),MainActivity.this); databaseAsyncTask.execute();
public class DatabaseAsyncTask extends AsyncTask<Void,Void,Void>{ private Context context; private Activity activity; public DatabaseAsyncTask(Context context,Activity activity) { this.activity = activity; this.context = context; } /** * 在doInBackground之前执行 */ @Override protected void <span style="color:#ff0000;">onPreExecute</span>() { super.onPreExecute(); } /** * 运行在ui线程中,在doInBackground()执行完毕后执行 */ @Override protected void <span style="color:#ff0000;">onPostExecute</span>(Void aVoid) { super.onPostExecute(aVoid); } /** * 在publishProgress()被调用以后执行,publishProgress()用于更新进度 */ @Override protected void <span style="color:#ff0000;">onProgressUpdate</span>(Void... values) { super.onProgressUpdate(values); } /** * 后台运行的方法,可以运行非UI线程,可以执行耗时的方法 */ @Override protected Void <span style="color:#ff0000;">doInBackground</span>(Void... params) { ArrayList<String> cityArrayList = MainActivity.cityArrayList; if(cityArrayList.size() != 0) { for(String city : cityArrayList) { SQLiteUtil.ReadData(city); } } return null; }}
结合例子讲完之后,再来说说使用AsyncTask的过程中应该注意的事情:
1) 继承异步任务类的类必须在UI线程中实例化
2) execute()方法也要在UI线程中调用
3) 不要手动的去调用前面说到的那四个函数咯,AsyncTask已经帮我们封装好了线程等东西,手动调用的话就相当于我们new了一个新的线程,直接调用其run()方法一样,会达到异步任务的效果么0.0,不过也可以手动调用的玩玩看~~~~
4) doInBackground()方法中返回值就是onPostExecute()方法(在doInBackground方法执行后执行在UI线程中)传入的参数,需要对应.
5) 实例化之后AsyncTask只能被执行一次,多次调用会出现异常情况的.还是演示下把,看图~~~~
今天的异步任务就到这里咯,我已经把我所有知道的东西都写出来了,各位有好的建议和意见都可以Q我2319821734或者直接给我留言的~~~~
0 0
- Android异步任务之AsyncTask的使用
- Android 异步任务 AsyncTask 的使用总结
- Android 异步任务AsyncTask的使用
- Android中异步任务AsyncTask的使用
- Android AsyncTask异步任务的使用
- Android 异步任务AsyncTask的使用
- Android异步任务AsyncTask使用
- android的异步任务AsyncTask
- 异步任务AsyncTask的使用
- AsyncTask异步任务的使用
- Android带进度条的文件上传,使用AsyncTask异步任务
- Android中AsyncTask(异步执行任务)的使用
- Android 异步任务AsyncTask类的简单使用
- Android异步任务AsyncTask的使用与原理分析
- Android异步任务AsyncTask的使用与原理分析
- Android异步任务AsyncTask的使用与原理分析
- Android异步任务AsyncTask的使用与原理分析
- Android异步任务AsyncTask的使用与原理分析
- 在Oracle数据库中怎样处理NULL
- Linux进程模型
- Android有效解决加载大图片时内存溢出的问题
- delete和delete[]的区别
- 一种容易出错的构造函数调用
- Android 异步任务AsyncTask的使用
- 总结iOS 8和Xcode 6的各种坑
- 关于makefile的一些学习经验
- OOP的基本原则
- 过年为什么要贴门神?
- NT_iOS笔记—百度社会化分享(64Bit)
- 我的学习之旅(39) sched.c
- FetchType.LAZY和FetchType.EAGER什么区别?(懒加载和急加载的理解)
- 深度学习之caffe安装历险记