官方文档:
    AsyncTask enables proper and easy use
of the UI thread. This class allows to perform background operations
and publish results on the UI thread without having to manipulate
threads and/or handlers.

    AsyncTask能够更恰当和更简单的去使用UI线程。这个类允许执行后台操作和展现结果在UI线程上,无需操纵线程和/或处理程序。AsyncTask的内部实现是一个线程池,每个后台任务会提交到线程池中的线程执行,然后使用Thread+Handler的方式调用回调函数。
   
1.AsyncTask抽象出后台线程运行的五个状态:
    分别是:1、准备运行,2、正在后台运行,3、进度更新,4、完成后台任务,5、取消任务,对于这五个阶段,AsyncTask提供了五个回调函数:

    1、准备运行:onPreExecute(),该回调函数在任务被执行之后立即由UI线程调用。这个步骤通常用来建立任务,在用户接口(UI)上显示进度条。
   
2、正在后台运行:doInParams...),该回调函数由后台线程在onPreExecute()方法执行结束后立即调用。通常在这里执行耗时的后
台计算。计算的结果必须由该函数返回,并被传递到onPostExecute()中。在该函数内也可以使用
publishProgress(Progress...)来发布一个或多个进度单位(unitsof
progress)。这些值将会在onProgressUpdate(Progress...)中被发布到UI线程。

    3. 进度更新:onProgressUpdate(Progress...),该函数由UI线程在publishProgress(Progress...)方法调用完后被调用。一般用于动态地显示一个进度条。
    4. 完成后台任务:onPostExecute(Result),当后台计算结束后调用。后台计算的结果会被作为参数传递给这一函数。
    5、取消任务:onCancelled (),在调用AsyncTask的cancel()方法时调用
2.使用:
    AsyncTask必须使用子类。子类会覆盖至少一个方法(doInParams…)),通常将覆盖第二个(onPostExecute(结果)。
AsyncTask的构造函数有三个模板参数:<Params, Progress, Result>

  1.Params,传递给后台任务的参数类型。
  2.Progress,后台计算执行过程中,进步单位(progress units)的类型。(就是后台程序已经执行了百分之几了。)
  3.Result, 后台执行返回的结果的类型。
  AsyncTask并不总是需要使用上面的全部3种类型。标识不使用的类型很简单,只需要使用Void类型即可。

     import java.io.InputStream;

     import java.net.HttpURLConnection;

     import java.net.URL;

     import android.app.Activity;

     import android.graphics.Bitmap;

     import android.graphics.BitmapFactory;

     import android.os.AsyncTask;

     import android.os.Bundle;

     import android.view.View;

     import android.view.View.OnClickListener;

     import android.widget.Button;

     import android.widget.ImageView;

     import android.widget.ProgressBar;

     import android.widget.Toast;

     /**

     * AsyncTask  实现异步加载图片

     */
public class MainActivity extends Activity { public static final String IMG_URL="http://images.51cto.com/images/index/Images/Logo.gif"; Button btn_asynctask; ImageView imgView; ProgressBar progressBar; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //加载控件 imgView = (ImageView) this.findViewById(R.id.imageView); btn_asynctask = (Button) this.findViewById(R.id.btn_AsyncTask); progressBar = (ProgressBar) this.findViewById(R.id.progressBar); //绑定监听器 btn_asynctask.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { GetImgTask getImgTask = new GetImgTask(); getImgTask.execute(IMG_URL); //执行该任务 } }); } /**获取网络图片任务**/ private class GetImgTask extends AsyncTask<String, Integer, Bitmap> { /**在 doInParams...)之前被调用,在ui线程执行 **/ @Override protected void onPreExecute() { imgView.setImageBitmap(null); progressBar.setProgress(); //进度条复位 } /**在后台线程中执行的任务**/
protected Bitmap doInString... params) { publishProgress(); //会调用onProgressUpdate更新界面 InputStream inputStream = null;
Bitmap imgBitmap = null;
try { URL url = new URL(IMG_URL); if(url != null) { HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setConnectTimeout(); connection.setDoInput(true); connection.setRequestMethod("GET"); int code = connection.getResponseCode(); if( == code) { inputStream = connection.getInputStream(); imgBitmap = BitmapFactory.decodeStream(inputStream); } } } catch (Exception e) { e.printStackTrace(); return null; } publishProgress(); //下载完成,更新进度条为满格 //这里不是UI线程,故不能直接setImage(imgBitmap), return imgBitmap; } /**在调用publishProgress之后被调用,在ui线程执行 **/ @Override protected void onProgressUpdate(Integer... values) { progressBar.setProgress(values[]); //设置进度条的进度 } /**在后台线程执行完成之后,调用该方法,获取数据更新界面**/ @Override protected void onPostExecute(Bitmap result) { if(result != null) { Toast.makeText(MainActivity.this, "成功获取图片", Toast.LENGTH_LONG).show(); imgView.setImageBitmap(result); }else { Toast.makeText(MainActivity.this, "获取图片失败", Toast.LENGTH_LONG).show(); }
} /**取消任务,在ui线程执行 **/
protected void onCancelled() { progressBar.setProgress();//进度条复位 super.onCancelled();
}
}
}

分析:

    1.点击按钮之后,创建一个任务,参数值为url(所以第一个参数为String)

    2.UI线程执行onPreExecute(),把ImageView的图片清空,progrssbar的进度清零。
   
3.后台线程执行doInBackground(),不可以在doInBackground()操作ui,调用publishProgress(0)更新
进度,此时会调用onProgressUpdate(Integer...progress)更新进度条(进度用整形表示,因此AsyncTask的第二
个模板参数是Integer)。函数最后返回result(例子中是返回Bitmap类型,因此AsyncTask的第三个模板参数是Bitmap)。

    4.当后台任务执行完成后,调用onPostExecute(Result),传入的参数是doInBackground()中返回的对象。

Android 异步加载数据 AsyncTask异步更新界面的更多相关文章

  1. [Android Pro] 使用CursorLoader异步加载数据 from 3.0

    Android 3.0引入了CursorLoader实现异步加载数据,为了避免同步查询数据库时阻塞UI线程的问题.在API 11之前可以通过下载支持库,来使之前的系统支持此功能,下载页面为 http: ...

  2. android 网络异步加载数据进度条

    ProgressDialog progressDialog = null; public static final int MESSAGETYPE = 0; private void execute( ...

  3. winform异步加载数据到界面

    做一个学习记录. 有两个需求: 1.点击按钮,异步加载数据,不卡顿UI. 2.把获取的数据加载到gridview上面. 对于需求1,2,代码如下: public delegate void ShowD ...

  4. 向上滚动或者向下滚动分页异步加载数据(Ajax + lazyload)[上拉加载组件]

    /**** desc : 分页异步获取列表数据,页面向上滚动时候加载前面页码,向下滚动时加载后面页码 ajaxdata_url ajax异步的URL 如data.php page_val_name a ...

  5. 淘宝购物车页面 智能搜索框Ajax异步加载数据

    如果有朋友对本篇文章的一些知识点不了解的话,可以先阅读此篇文章.在这篇文章中,我大概介绍了一下构建淘宝购物车页面需要的基础知识. 这篇文章主要探讨的是智能搜索框Ajax异步加载数据.jQuery的社区 ...

  6. Jquery zTree结合Asp.net实现异步加载数据

    zTree结合Asp.net实现异步加载数据 实现简单操作 zTree 下载 api 访问 :http://www.ztree.me/v3/main.php 例子中用到json数据转化 newtons ...

  7. jquery easyui easyui-treegrid 使用异步加载数据

    jquery easyui easyui-treegrid 使用异步加载数据 jquery easyui easyui-treegrid 异步请求 >>>>>>&g ...

  8. Highcharts 异步加载数据曲线图表

    导入 data.js 文件 异步加载数据需要引入以下js 文件: <script src="http://code.highcharts.com/modules/data.js&quo ...

  9. [Ext.Net]TreePanel 异步加载数据

    异步加载数据指的是页面加载的时候只显示根目录,点击根目录再去加载其子目录. 下面就来介绍下这种异步加载的树结构要怎么实现 现将例子的图 QQ图片20131225134353.jpg (12.1 KB, ...

随机推荐

  1. 【381】python 获取列表中重复元素的索引值

    参考:获取python的list中含有重复值的index方法_python_脚本之家 核心思想:建立字典,遍历列表,把列表中每个元素和其索引添加到字典里面 cc = [1, 2, 3, 2, 4] f ...

  2. HttpURLConnection类的使用

    此类以获取天气的一个api地址为例: package javaexcjs; import java.io.BufferedReader; import java.io.OutputStreamWrit ...

  3. 多线程 死锁 wait(int i) notifyAll()

    public class ThreadDemo5 { public static void main(String[] args){ Pool pool = new Pool(); Productor ...

  4. hdu1573-X问题-(扩展欧几里得定理+中国剩余定理)

    X问题 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  5. ECharts-初始化方法参数不能传入jquery对象

    ECharts-初始化方法参数不能传入jquery对象

  6. 安装FP

    一.安装Oracle 11.2 64-bit数据库 1.安装数据库软件并将SEINESCM数据库还原到服务器上, 2.配置监听和TNS信息 二.安装数据库32位客户端(为SSIS配套使用).安装ORA ...

  7. sqlserver 事务嵌套

    参考 https://www.cnblogs.com/JentleWang/p/3654603.html https://blog.csdn.net/tuzhen007/article/details ...

  8. Windows Server2012 R2 安装.NET Framework 3.5失败解决方法

    转载:https://blog.csdn.net/F12138_/article/details/80220698 显示需要指定备用路径,但我没有指定 然后就出现了的失败T T! 由于我无法访问安装盘 ...

  9. C# 写App.config配置文件的方法

    private static void AccessAppSettings() { //获取Configuration对象 Configuration config = ConfigurationMa ...

  10. 百度浏览器 UserAgent

    Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 BIDUBrowser ...