Android 异步加载数据 AsyncTask异步更新界面
官方文档:
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异步更新界面的更多相关文章
- [Android Pro] 使用CursorLoader异步加载数据 from 3.0
Android 3.0引入了CursorLoader实现异步加载数据,为了避免同步查询数据库时阻塞UI线程的问题.在API 11之前可以通过下载支持库,来使之前的系统支持此功能,下载页面为 http: ...
- android 网络异步加载数据进度条
ProgressDialog progressDialog = null; public static final int MESSAGETYPE = 0; private void execute( ...
- winform异步加载数据到界面
做一个学习记录. 有两个需求: 1.点击按钮,异步加载数据,不卡顿UI. 2.把获取的数据加载到gridview上面. 对于需求1,2,代码如下: public delegate void ShowD ...
- 向上滚动或者向下滚动分页异步加载数据(Ajax + lazyload)[上拉加载组件]
/**** desc : 分页异步获取列表数据,页面向上滚动时候加载前面页码,向下滚动时加载后面页码 ajaxdata_url ajax异步的URL 如data.php page_val_name a ...
- 淘宝购物车页面 智能搜索框Ajax异步加载数据
如果有朋友对本篇文章的一些知识点不了解的话,可以先阅读此篇文章.在这篇文章中,我大概介绍了一下构建淘宝购物车页面需要的基础知识. 这篇文章主要探讨的是智能搜索框Ajax异步加载数据.jQuery的社区 ...
- Jquery zTree结合Asp.net实现异步加载数据
zTree结合Asp.net实现异步加载数据 实现简单操作 zTree 下载 api 访问 :http://www.ztree.me/v3/main.php 例子中用到json数据转化 newtons ...
- jquery easyui easyui-treegrid 使用异步加载数据
jquery easyui easyui-treegrid 使用异步加载数据 jquery easyui easyui-treegrid 异步请求 >>>>>>&g ...
- Highcharts 异步加载数据曲线图表
导入 data.js 文件 异步加载数据需要引入以下js 文件: <script src="http://code.highcharts.com/modules/data.js&quo ...
- [Ext.Net]TreePanel 异步加载数据
异步加载数据指的是页面加载的时候只显示根目录,点击根目录再去加载其子目录. 下面就来介绍下这种异步加载的树结构要怎么实现 现将例子的图 QQ图片20131225134353.jpg (12.1 KB, ...
随机推荐
- 【381】python 获取列表中重复元素的索引值
参考:获取python的list中含有重复值的index方法_python_脚本之家 核心思想:建立字典,遍历列表,把列表中每个元素和其索引添加到字典里面 cc = [1, 2, 3, 2, 4] f ...
- Windows常用命令实例
熟练使用DOS常用命令有助于提高工作效率. 1.windows+R:打开运行程序窗口 2.cmd:调用DOS命令窗口 3.mstsc:调用远程桌面命令窗口.mstsc -v 192.168..0.1 ...
- android listview中item通过viewpager实现《IT蓝豹》
android listview中item通过viewpager实现 android listview中item通过viewpager实现,每一个item都支持viewpager实现图片切换功能.本项 ...
- Ubuntu中清理Network下Connect to Server的入口
转自:http://blog.csdn.net/maxilbert/article/details/51126467 connect to server入口列表文件以xml格式存放在 ~/.confi ...
- yum except KeyboardInterrupt, e: 错误
在上一篇升级python的时候的,使用yum时,出现以下错误 [root@localhost bin]# yum File "/usr/bin/yum", line 30 ...
- 【Django】关于scss 的安装
今天看视频教程的时候发现老师的样式文件改用了scss(然鹅我买的1块钱特价课程其实是节选出来的,所以前面没有看到过关于scss的介绍) 然后我本以为把原来的css改名字为scss就行,然鹅没有效果. ...
- web.config中连接字符串的读写和加密解密
转载:https://www.cnblogs.com/shuai/articles/2248703.html 1.先来看看如何在web.config中写入数据库连接字符串.打开web.config文件 ...
- 区分action, service和dao
在这里,我们不仅要处理页面逻辑,还要做业务逻辑,还要做数据访问.比如说: public String addUser() { if(user == null) { return FAIL_NO_USE ...
- C# winform 支持html5的 控件
OpenWebKitSharp WebKit.net c#winform中使用WebKit传递js对象实现与网页交互 分类: .NET开发2013-08-18 23:55 2496人阅读 评论(1) ...
- cf-Global Round2-C. Ramesses and Corner Inversion(思维)
题目链接:http://codeforces.com/contest/1119/problem/C 题意:给两个同型的由0.1组成的矩阵A.B,问A能否经过指定的操作变成B,指定操作为在矩阵A中选定一 ...