Android 结合实例学会AsyncTask的使用方法
2014-11-06 10:13
274 查看
AsyncTask运行时经过四个步骤,运行四个方法:
1.onPreExecute(),执行在UI线程,能够设置或改动UI控件,如显示一个进度条
2.doInBackground,执行在后台线程,不能够设置或改动UI控件,该方法的执行时机是:
onPreExecute()运行完成马上调用该方法,在方法中进行耗时操作,能够在该方法中调用publishProgress方法
来公布当运行的进度,调用publishProgress方法后就会马上触发onProgressUpdate方法
3.onProgressUpdate,执行在UI线程,能够设置或改动UI控件
4.onPostExecute,执行在UI线程,能够设置或改动UI控件,该方法在doInBackground方法执行完成
后就会调用,该方法的參数就是doInBackground方法返回的结果,能够这样思考:doInBackground方法
既然有一个返回结果,那么这个返回结果究竟返回给谁呢?答案就是:通过參数形式传递给onPostExecute方法
參数说明:
1.doInBackground方法的形參相应的是AsyncTask的第一个參数,即參数类型要同样。doInBackground方法
接收实參的时机是:在UI线程中调用execute方法时为execute方法设置值,调用execute方法,这个值就会通过參数形式传给doInBackground方法,doInBackground方法返回的结果相应的是AsyncTask的第三个參数,即參数类型要同样,
2.onPostExecute方法的參数值就是doInBackground方法返回的结果传递过来的。因此onPostExecute方法的參数
类型与AsyncTask的第三个參数也相应。即同样
3.onProgressUpdate方法的參数类型与AsyncTask的第二个參数相应,即參数类型要同样,在doInBackground方法中能够调用
publishProgress方法将进度值传递给onProgressUpdate方法,进度值的类型由AsyncTask的第二个參数类型决定
參数说明小结:
1.AsyncTask的第一个參数类型决定了doInBackground方法、execute方法的參数类型
2.AsyncTask的第二个參数类型决定了publishProgress方法、onProgressUpdate方法的參数类型
3.AsyncTask的第三个參数类型决定了doInBackground方法的返回值类型、onPostExecute方法的參数类型
注:假设不须要參数传递,那么AsyncTask的參数列表能够写成:AsyncTask<Void, Void, Void>
使用AsyncTask类必须遵循的规则:
1.AsyncTask类必须在UI thread载入
2.Task实例必须在UI thread中创建
3.execute方法必须在UI thread中调用
4.不要手动调用onPreExecute、onPostExecute、doInBackground、onProgressUpdate方法
5.该Task仅仅能运行一次,多次调用将会抛出异常
AsyncTask类的使用能够參见AsyncTask源代码凝视部分,当中有具体说明
(原文链接:/article/1513444.html,欢迎转载,转载时请注明出处!!)
展示一个样例:
[align=left]packagecom.text.asynctaskdemo;[/align]
[align=left]importandroid.app.Activity;[/align]
[align=left]importandroid.os.AsyncTask;[/align]
[align=left]importandroid.os.Bundle;[/align]
[align=left]importandroid.util.Log;[/align]
publicclassMainActivity
extends
Activity {
privatestaticfinalString
TAG
= "asynctaskdemo";
[align=left] @Override[/align]
protectedvoidonCreate(Bundle
savedInstanceState) {
[align=left] super.onCreate(savedInstanceState);[/align]
[align=left] setContentView(R.layout.activity_main);[/align]
new
LoadAllAppsTask().execute(
"Test AsyncTask");
[align=left] }[/align]
privateclassLoadAllAppsTask
extends
AsyncTask<String, Integer, Long> {
[align=left] [/align]
[align=left] @Override[/align]
protectedvoidonPreExecute()
{
//
TODO
Auto-generated method stub
[align=left] Log.d(TAG,"onPreExecute");[/align]
[align=left] super.onPreExecute();[/align]
[align=left] }[/align]
[align=left] @Override[/align]
protectedLong doInBackground(String... params)
{
//
TODO
Auto-generated method stub
Log.d(TAG,"doInBackground
params[0]="+params[0]);
[align=left] publishProgress(10);[/align]
[align=left] return100L;[/align]
[align=left] }[/align]
[align=left] @Override[/align]
protectedvoidonProgressUpdate(Integer...
values) {
//
TODO
Auto-generated method stub
Log.d(TAG,"onProgressUpdate
values[0]="+ values[0]);
[align=left] super.onProgressUpdate(values);[/align]
[align=left] }[/align]
[align=left] @Override[/align]
protectedvoidonPostExecute(Long
result) {
//
TODO
Auto-generated method stub
Log.d(TAG,"onPostExecute
result="+ result);
[align=left] super.onPostExecute(result);[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left]}[/align]
输出结果:
06-10 14:17:08.724: DEBUG/asynctaskdemo(7419): onPreExecute
06-10 14:17:08.731: DEBUG/asynctaskdemo(7419): doInBackground params[0]=Test AsyncTask
06-10 14:17:08.771: DEBUG/asynctaskdemo(7419): onProgressUpdate values[0]=10
06-10 14:17:08.771: DEBUG/asynctaskdemo(7419): onPostExecute result=100
doInBackground(String... params)方法的形參列表能够接受多个參数值,以下演示一下,接受多个參数值的过程:
1.execute方法中传入多个參数:
newLoadAllAppsTask().execute("Test AsyncTask",
"Test AsyncTask2","Test AsyncTask3");
2.doInBackground方法中获取第二个參数的值时,直接params[1]就能够取到,获取第三个就使用params[2],例如以下:
protectedLong doInBackground(String... params)
{
//
TODO
Auto-generated method stub
Log.d(TAG,"doInBackground
params[1]="+ params[1]);
[align=left] publishProgress(10);[/align]
[align=left] return100L;[/align]
[align=left] }[/align]
改动之后,执行上面程序,输出结果:
06-10 14:24:57.834: DEBUG/asynctaskdemo(8269): onPreExecute
06-10 14:24:57.843: DEBUG/asynctaskdemo(8269): doInBackground params[1]=Test AsyncTask2
06-10 14:24:57.926: DEBUG/asynctaskdemo(8269): onProgressUpdate values[0]=10
06-10 14:24:57.926: DEBUG/asynctaskdemo(8269): onPostExecute result=100
1.onPreExecute(),执行在UI线程,能够设置或改动UI控件,如显示一个进度条
2.doInBackground,执行在后台线程,不能够设置或改动UI控件,该方法的执行时机是:
onPreExecute()运行完成马上调用该方法,在方法中进行耗时操作,能够在该方法中调用publishProgress方法
来公布当运行的进度,调用publishProgress方法后就会马上触发onProgressUpdate方法
3.onProgressUpdate,执行在UI线程,能够设置或改动UI控件
4.onPostExecute,执行在UI线程,能够设置或改动UI控件,该方法在doInBackground方法执行完成
后就会调用,该方法的參数就是doInBackground方法返回的结果,能够这样思考:doInBackground方法
既然有一个返回结果,那么这个返回结果究竟返回给谁呢?答案就是:通过參数形式传递给onPostExecute方法
參数说明:
1.doInBackground方法的形參相应的是AsyncTask的第一个參数,即參数类型要同样。doInBackground方法
接收实參的时机是:在UI线程中调用execute方法时为execute方法设置值,调用execute方法,这个值就会通过參数形式传给doInBackground方法,doInBackground方法返回的结果相应的是AsyncTask的第三个參数,即參数类型要同样,
2.onPostExecute方法的參数值就是doInBackground方法返回的结果传递过来的。因此onPostExecute方法的參数
类型与AsyncTask的第三个參数也相应。即同样
3.onProgressUpdate方法的參数类型与AsyncTask的第二个參数相应,即參数类型要同样,在doInBackground方法中能够调用
publishProgress方法将进度值传递给onProgressUpdate方法,进度值的类型由AsyncTask的第二个參数类型决定
參数说明小结:
1.AsyncTask的第一个參数类型决定了doInBackground方法、execute方法的參数类型
2.AsyncTask的第二个參数类型决定了publishProgress方法、onProgressUpdate方法的參数类型
3.AsyncTask的第三个參数类型决定了doInBackground方法的返回值类型、onPostExecute方法的參数类型
注:假设不须要參数传递,那么AsyncTask的參数列表能够写成:AsyncTask<Void, Void, Void>
使用AsyncTask类必须遵循的规则:
1.AsyncTask类必须在UI thread载入
2.Task实例必须在UI thread中创建
3.execute方法必须在UI thread中调用
4.不要手动调用onPreExecute、onPostExecute、doInBackground、onProgressUpdate方法
5.该Task仅仅能运行一次,多次调用将会抛出异常
AsyncTask类的使用能够參见AsyncTask源代码凝视部分,当中有具体说明
(原文链接:/article/1513444.html,欢迎转载,转载时请注明出处!!)
展示一个样例:
[align=left]packagecom.text.asynctaskdemo;[/align]
[align=left]importandroid.app.Activity;[/align]
[align=left]importandroid.os.AsyncTask;[/align]
[align=left]importandroid.os.Bundle;[/align]
[align=left]importandroid.util.Log;[/align]
publicclassMainActivity
extends
Activity {
privatestaticfinalString
TAG
= "asynctaskdemo";
[align=left] @Override[/align]
protectedvoidonCreate(Bundle
savedInstanceState) {
[align=left] super.onCreate(savedInstanceState);[/align]
[align=left] setContentView(R.layout.activity_main);[/align]
new
LoadAllAppsTask().execute(
"Test AsyncTask");
[align=left] }[/align]
privateclassLoadAllAppsTask
extends
AsyncTask<String, Integer, Long> {
[align=left] [/align]
[align=left] @Override[/align]
protectedvoidonPreExecute()
{
//
TODO
Auto-generated method stub
[align=left] Log.d(TAG,"onPreExecute");[/align]
[align=left] super.onPreExecute();[/align]
[align=left] }[/align]
[align=left] @Override[/align]
protectedLong doInBackground(String... params)
{
//
TODO
Auto-generated method stub
Log.d(TAG,"doInBackground
params[0]="+params[0]);
[align=left] publishProgress(10);[/align]
[align=left] return100L;[/align]
[align=left] }[/align]
[align=left] @Override[/align]
protectedvoidonProgressUpdate(Integer...
values) {
//
TODO
Auto-generated method stub
Log.d(TAG,"onProgressUpdate
values[0]="+ values[0]);
[align=left] super.onProgressUpdate(values);[/align]
[align=left] }[/align]
[align=left] @Override[/align]
protectedvoidonPostExecute(Long
result) {
//
TODO
Auto-generated method stub
Log.d(TAG,"onPostExecute
result="+ result);
[align=left] super.onPostExecute(result);[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left]}[/align]
输出结果:
06-10 14:17:08.724: DEBUG/asynctaskdemo(7419): onPreExecute
06-10 14:17:08.731: DEBUG/asynctaskdemo(7419): doInBackground params[0]=Test AsyncTask
06-10 14:17:08.771: DEBUG/asynctaskdemo(7419): onProgressUpdate values[0]=10
06-10 14:17:08.771: DEBUG/asynctaskdemo(7419): onPostExecute result=100
doInBackground(String... params)方法的形參列表能够接受多个參数值,以下演示一下,接受多个參数值的过程:
1.execute方法中传入多个參数:
newLoadAllAppsTask().execute("Test AsyncTask",
"Test AsyncTask2","Test AsyncTask3");
2.doInBackground方法中获取第二个參数的值时,直接params[1]就能够取到,获取第三个就使用params[2],例如以下:
protectedLong doInBackground(String... params)
{
//
TODO
Auto-generated method stub
Log.d(TAG,"doInBackground
params[1]="+ params[1]);
[align=left] publishProgress(10);[/align]
[align=left] return100L;[/align]
[align=left] }[/align]
改动之后,执行上面程序,输出结果:
06-10 14:24:57.834: DEBUG/asynctaskdemo(8269): onPreExecute
06-10 14:24:57.843: DEBUG/asynctaskdemo(8269): doInBackground params[1]=Test AsyncTask2
06-10 14:24:57.926: DEBUG/asynctaskdemo(8269): onProgressUpdate values[0]=10
06-10 14:24:57.926: DEBUG/asynctaskdemo(8269): onPostExecute result=100
相关文章推荐
- Android 结合实例学会AsyncTask的用法
- Android 结合实例学会AsyncTask的用法
- 【Android】学习笔记(13)——AsyncTask使用实例
- Android Service的使用方法 音乐播放器实例
- Android自动化测试之Monkeyrunner使用方法及实例
- [Android] AsyncTask使用实例---加载网络图片
- Android自动化测试之Monkeyrunner使用方法及实例
- Android Service的使用方法 音乐播放器实例
- Android HTTP实例 使用GET方法和POST方法发送请求
- android的AsyncTask使用方法-多线程下载
- Mysql中DATE_SUB 使用方法结合查询一天内,一周内,一月内的信息实例讲解
- android数据库存储方法(一)---------------SharedPreferences(实例)记录应用程序使用次数(一)
- Android自动化测试之Monkeyrunner使用方法及实例
- Mysql中DATE_SUB 使用方法结合查询一天内,一周内,一月内的信息实例讲解
- android数据库存储方法(一)---------------SharedPreferences(实例)记录应用程序使用次数(一)
- [Android] AsyncTask使用实例---加载网络图片
- android WakeLock使用方法代码实例
- Android Service使用方法--简单音乐播放实例
- Android HTTP实例 使用GET方法和POST方法发送请求(通过Apache接口实现)
- Mysql中DATE_SUB 使用方法结合查询一天内,一周内,一月内的信息实例讲解