Android 解析AsyncTask(一)
2015-07-25 19:18
459 查看
Android 解析AsyncTask(一)
大家都知道在开发Android中涉及到UI的修改都必须在UI线程中操作,并且执行耗时的操作绝不能在UI线程上干,一般使用线程或者开启线程池处理。如果要把耗时的任务执行的结果显示到UI上,也许会使用Thread+Handler这种方式来处理,但是个人感觉其内聚性不是很高。而AsyncTask非常适合上述应用场景,它其实是Thread+Handler的结合体,通过它你可以执行耗时的操作,并把结果转移到UI线程中,甚至可以显示执行进度,下面阐述下它的基本使用方法。使用
AsyncTask是个抽象类,如果你使用的话必须要实现doInBackground(Params…)方法,一般的话你也要复写onPostExecute(Result),下面给出一个简单的样例private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { protected Long doInBackground(URL... urls) { int count = urls.length; long totalSize = 0; for (int i = 0; i < count; i++) { totalSize += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count) * 100)); // Escape early if cancel() is called if (isCancelled()) break; } return totalSize; } protected void onProgressUpdate(Integer... progress) { setProgressPercent(progress[0]); } protected void onPostExecute(Long result) { showDialog("Downloaded " + result + " bytes"); } }
上述类创建好后,就可以轻松调用了,
new DownloadFilesTask().execute(url1, url2, url3);
AsyncTask的三种参数类型
当你继承AsyncTask时需要你指定三种参数类型Params, 就是AsyncTask执行时接受的可变参数类型,
也是方法doInBackground传入的参数类型
Progress 进度更新时传入的参数也是方法
publishProgress、onProgressUpdate传入的参数
Result 后台执行后返回的数据类型
如果你觉得不需要参数的话,你可以都用Void来代替
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
AsyncTask执行的四步
当一个异步任务被执行时,AsyncTask会执行下述四个步骤:onPreExecute(),
该方法会在UI线程中调用并且是在任务被执行前调用,你可以在这里去创建一个对话框显示其进度或者提示信息。
doInBackground(Params…),
当onPreExecute()调用结束后该方法立马被执行并且是运行在后台线程中。所以你可以在该方法中执行耗时的操作比如网络的请求,文件下载等等。该方法的参数就是你传入给AsyncTask的参数,执行后会返回结果,并会把结果传递给第四步。你可以在该方法中调用publishProgress(Progress…)去发布进度信息,该进度信息会被转移到onProgressUpdate(Progress…)方法中。
onProgressUpdate(Progress…),
调用publishProgress(Progress…)后该方法会在UI线程中被调用,该方法能够显示后台任务执行的进度消息等。
onPostExecute(Result),
后台任务执行完毕后将调用该方法,并将计算的结果以参数的形式转移给该方法。
取消一个任务
你可以通过调用cancel(boolean)来取消任务,调用它后onCancelled(Object)将会在doInBackground(Object[]) 返回之后被调用,onPostExecute(Object)则不会执行,为确保任务能够被及时取消,建议取消前使用isCancelled()方法判断当前任务是否被取消。注意事项
AsyncTask必须在UI线程创建,且方法execute(Params…) 也必须在UI线程中使用不要手动调用 onPreExecute(), onPostExecute(Result), doInBackground(Params…), onProgressUpdate(Progress…) 方法
任务仅仅能被执行一次,如果调用多次execute方法将会抛出异常
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories