详解Android中AsyncTask的使用
2015-09-02 21:37
429 查看
Android1.5提供了工具类android.os.AsyncTask,它使创建异步任务变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务。
先来看看AsyncTask的定义:
public abstract class AsyncTask<Params, Progress, Result> {
三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型”。在特定场合下,并不是所有类型都被使用,如果没有被使用,可以用java.lang.Void类型代替。
一个异步任务的执行一般包括以下几个步骤:
1.execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。
2.onPreExecute(),在execute(Params... params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记。
3.doInBackground(Params... params),在onPreExecute()此方法是在子线程中执行,用于执行较为费时的操作,任务完成将返回结果。注意此方法是不可以进行UI操作的。如要显示进度,在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。
4.onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。
5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。
在使用的时候,有几点需要格外注意:
1.异步任务的实例必须在UI线程中创建。
2.execute(Params... params)方法必须在UI线程中调用。
3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。
4.不能在doInBackground(Params... params)中更改UI组件的信息。
5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。
执行
补充AsyncTask执行流程:
今天用到AsynTask的时候 ,发现在doInBackground()函数执行后,接下去并不执行onPostExecute(). 原来是参数的问题 ,doInBackground()函数返回的类型是void ,而onPostExecute()接收的参数是Integer类型。改变doInBackground()函数返回的类型为Integer,就可以正常执行啦。
多注意下AsynTask的各个参数含义~
先来看看AsyncTask的定义:
public abstract class AsyncTask<Params, Progress, Result> {
三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型”。在特定场合下,并不是所有类型都被使用,如果没有被使用,可以用java.lang.Void类型代替。
一个异步任务的执行一般包括以下几个步骤:
1.execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。
2.onPreExecute(),在execute(Params... params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记。
3.doInBackground(Params... params),在onPreExecute()此方法是在子线程中执行,用于执行较为费时的操作,任务完成将返回结果。注意此方法是不可以进行UI操作的。如要显示进度,在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。
4.onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。
5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。
在使用的时候,有几点需要格外注意:
1.异步任务的实例必须在UI线程中创建。
2.execute(Params... params)方法必须在UI线程中调用。
3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。
4.不能在doInBackground(Params... params)中更改UI组件的信息。
5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。
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执行流程:
今天用到AsynTask的时候 ,发现在doInBackground()函数执行后,接下去并不执行onPostExecute(). 原来是参数的问题 ,doInBackground()函数返回的类型是void ,而onPostExecute()接收的参数是Integer类型。改变doInBackground()函数返回的类型为Integer,就可以正常执行啦。
多注意下AsynTask的各个参数含义~
相关文章推荐
- Android中的隐藏API和Internal包的使用
- android___文件访问权限
- Android问题集(七)——TableLayout 中让TableRow中的控件填充满整列
- Android 开发日志——Handler引起内存泄漏
- android___测试Test
- android__常见布局
- Android接口回调,最简单的理解方式
- Android-调用本地方法实现将C进程分支出来即生成系统进程/NDK-JNI开发实例(九)
- android__实践(登陆界面)
- android__实践(电话拨号器)
- android__实践(短信发送器)
- Android studio中JNI-NDK开发打印LOG出现 undefined reference to `__android_log_print' 解决
- Android__基础
- Android小例子:圆角按钮、CheckBox使用、退出确认框、Intent传值、Activity显示软件信息
- Android xmlns 的作用及其自定义
- Android 应用开始界面制作
- Google 发布 Android 性能优化典范
- android CoordinatorLayout使用
- Android内存优化(五)-- 分析内存的使用
- Android内存优化(四)-- 分析内存的使用