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源代码凝视部分,当中有具体说明


(原文链接:http://blog.csdn.net/yelangjueqi/article/details/38322647,欢迎转载,转载时请注明出处!!) 

展示一个样例:
packagecom.text.asynctaskdemo;

importandroid.app.Activity;
importandroid.os.AsyncTask;
importandroid.os.Bundle;
importandroid.util.Log;

publicclassMainActivity
extends
Activity {
     privatestaticfinalString
TAG
= "asynctaskdemo";

     @Override
     protectedvoidonCreate(Bundle
savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          new
LoadAllAppsTask().execute(
"Test AsyncTask");
     }

     privateclassLoadAllAppsTask
extends
AsyncTask<String, Integer, Long> {
          
          @Override
          protectedvoidonPreExecute()
{
              //
TODO
Auto-generated method stub
              Log.d(TAG,"onPreExecute");
              super.onPreExecute();
          }

          @Override
          protectedLong doInBackground(String... params)
{
              //
TODO
Auto-generated method stub
              Log.d(TAG,"doInBackground
params[0]="+params[0]);
              publishProgress(10);
              return100L;
          }

          @Override
          protectedvoidonProgressUpdate(Integer...
values) {
              //
TODO
Auto-generated method stub
              Log.d(TAG,"onProgressUpdate
values[0]="+ values[0]);
              super.onProgressUpdate(values);
          }

          @Override
          protectedvoidonPostExecute(Long
result) {
              //
TODO
Auto-generated method stub
              Log.d(TAG,"onPostExecute
result="+ result);
              super.onPostExecute(result);
          }
     }
}

输出结果:
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]);
              publishProgress(10);
              return100L;
          }
改动之后,执行上面程序,输出结果:
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的使用方法的更多相关文章

  1. Android 结合实例学会AsyncTask的用法

    AsyncTask执行时经过四个步骤,执行四个方法: 1.onPreExecute(),运行在UI线程,可以设置或修改UI控件,如显示一个进度条 2.doInBackground,运行在后台线程,不可 ...

  2. Android HTTP实例 使用GET方法和POST方法发送请求

    Android HTTP实例 使用GET方法和POST方法发送请求 Web程序:使用GET和POST方法发送请求 首先利用MyEclispe+Tomcat写好一个Web程序,实现的功能就是提交用户信息 ...

  3. Android中异步类AsyncTask的理解

    这里有两种解释的方法,各有侧重点: 第一种解释: Async Task 简介:AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦  ...

  4. Android中糟糕的AsyncTask

    上周做一个Android中的帧动画,因为每帧图片都比较大,所以采用每次读取一帧,延时再读取下一帧的方式实现.在读取的时候,采用AsyncTask,去设置ImageView的背景.但是发现需要切换帧动画 ...

  5. Android必学之AsyncTask

    AsyncTask,即异步任务,是Android给我们提供的一个处理异步任务的类.通过此类,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程. .为什么需要使用异步任务 ...

  6. 【转】 Android常用实例—Alert Dialog的使用

    Android常用实例—Alert Dialog的使用 AlertDialog的使用很普遍,在应用中当你想要用户做出“是”或“否”或者其它各式各样的选择时,为了保持在同样的Activity和不改变用户 ...

  7. Android异步任务处理框架AsyncTask源代码分析

    [转载请注明出处:http://blog.csdn.net/feiduclear_up CSDN 废墟的树] 引言 在平时项目开发中难免会遇到异步耗时的任务(比方最常见的网络请求).遇到这样的问题.我 ...

  8. Android - 内存泄漏的情况以及解决方法

    [译]Android内存泄漏的八种可能(上) Android防止内存泄漏的八种方法(下). Static Activities 在类中定义了静态Activity变量,把当前运行的Activity实例赋 ...

  9. Android线程管理之AsyncTask异步任务

    前言: 前面几篇文章主要学习了线程以及线程池的创建与使用,今天来学习一下AsyncTask异步任务,学习下AsyncTask到底解决了什么问题?然而它有什么弊端?正所谓知己知彼百战百胜嘛! 线程管理相 ...

随机推荐

  1. Linux下安装配置词典GoldenDict

    GoldenDict   apt-get install goldendict 安装完成以后,需要自己手动加入字典,增加在线翻译网址(例如,有道,金山等),点击 编辑--dictionaries  完 ...

  2. SQL Server 2008中文企业版下载地址和序列号[转]

    SQLSERVER2008下载链接http://sqlserver.dlservice.microsoft.com/dl/download/B/8/0/B808AF59-7619-4A71-A447- ...

  3. if(男深圳集体户口&&女非深圳户口)深圳准生证办理材料及流程

    所需材料 一.女方需要办理流动人口婚育证明(蓝色的小本本). 办理材料.各地可能不同.这个是在女方的户籍所在地办理(最好在女方户籍所在地办理女方初婚未育证明). 二.男方在公司开出初婚未育证明. 三. ...

  4. 一起C语言中程序时序问题的排查过程

    [文章摘要] 对于由多个模块协同工作的软件来说,程序处理的时序是很重要的.当消息处理的顺序出现混乱时,程序就会出现异常. 本文基于作者的实际项目经验.对软件模块之间的时序问题进行了具体的分析,为相关软 ...

  5. List接口实现类-ArrayList、Vector、LinkedList集合深入学习以及源代码解析

    学习List接口实现类 ArrayList  Vector  LinkedList List接口的实现类中最经常使用最重要的就是这三个:ArrayList.Vector.LinkedList. JDK ...

  6. 2014 I/O归来:Google连接一切

    6月,WWDC 2014与Google I/O  (大部分演讲视频都公开.Youtube须要FQ,很值得一看)相继召开.今年是我第三年參加Google I/O大会. 三年间.Google积累了非常多技 ...

  7. Winfrom 表格单元格格式化事件(DataGridView - CellFormatting)

    格式化 14,15列将编码显示为编码值 this.dgv_prescription.CellFormatting += (object sen, DataGridViewCellFormattingE ...

  8. Windows8 Metro快捷键 | Win8迷

    Windows8 Metro快捷键 | Win8迷   Win + Q : 打开 搜索面板 Win + C : 打开屏幕右侧的Charms简化菜单 Win + 空格 : 切换输入语言和键盘布局  

  9. DBA 应该要注意Linux 环境下的一些操作

    DBA 对OS的依赖.一丁点儿也不亚于DB.对于Oracle DBA.尤为突出     DB和OS的感情也与日俱增.耦合度高的让人一度以为这两要劳燕双飞了 例如.Oracle里面. 而且.故障诊断以及 ...

  10. shell脚本中怎样同时执行多个.sql文件,并把结果写入文件中(转)

    转载:http://joewalker.iteye.com/blog/408879命令行下具体用法如下: mysqldump -u用戶名 -p密码 -d 数据库名 表名 > 脚本名;导出整个数据 ...