我们在《Android学习之Handler消息传递机制》(http://www.cnblogs.com/zhouhb/p/5812447.html)已提到过,Android只允许UI线程修改Activity里的UI组件,这样会导致新启动的线程无法动态改变界面组件的属性值。为了解决新线程不能更新UI组件的问题,除了可以借助于Handler的消息传递机制来实现,还可以使用AsycTask。
1 AsyncTask使用方法简介
AsyncTask<Params, Progress, Result>是一个抽象类,通常用于被继承。继承AsyncTask需要指定如下三个泛型参数:
  • Params: 这个泛型指定的是我们传递给异步任务执行时的参数的类型
  • Progress: 这个泛型指定的是我们的异步任务在执行的时候将执行的进度返回给UI线程的参数的类型
  • Result: 这个泛型指定的异步任务执行完后返回给UI线程的结果的类型
 我们在定义一个类继承AsyncTask类的时候,必须要指定好这三个泛型的类型,如果都不指定的话,则都将其写成Void,例如:
AsyncTask <Void, Void, Void>
当我们执行一个异步任务的时候,其需要按照下面的4个步骤分别执行
  • onPreExecute(): 这个方法是在执行异步任务之前的时候执行,通常我们在这个方法里做一些UI控件的初始化的操作,例如弹出进度条等。
  • doInBackground(Params... params): 这个方法就是用来处理异步任务的方法。在该方法可以调用publishProgress(Progress)方法更新任务的执行进度。
  • onProgressUpdate(Progess... values):在 doInBackground 方法中调用publishProgress(Progress) 方法会触发该方法。
  • onPostExecute(Result... result): 当doInBackground(Params... params)方法完成后,系统会自动调用该方法,并将doInBackground(Params... params)方法的返回值传递给该方法。
使用AsyncTask时必须遵循的原则:
(1)必须在UI线程中创建AsyncTask的实例;
(2)必须在UI线程中调用AsyncTask的execute()方法;
(3)AsyncTask的onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progess... values),以及onPostExecute(Result... result)方法不应该由程序员代码调用,而是由系统负责调用;
(4)每个AsyncTask只能被执行一次,多次调用会引发异常。
2 AsyncTask使用实例
2.1 Activity代码
public class MainActivity extends Activity {
private TextView show;
private Button btn; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show=(TextView)findViewById(R.id.show);
show.setMovementMethod(ScrollingMovementMethod.getInstance());
btn=(Button)findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
doTask();
} });
} private void doTask() {
// TODO Auto-generated method stub
DownTask task=new DownTask(this,show);
try {
task.execute(new URL("http://www.szit.edu.cn/"));
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

  

2.2 AsyncTask的子类DownTask代码
public class DownTask extends AsyncTask<URL, Integer, String>
{
ProgressDialog progressDialog;
int hasRead=0;
Context context;
TextView show;
public DownTask(Context context,TextView show)
{
this.context=context;
this.show=show;
} @Override
protected String doInBackground(URL... arg0) {
// TODO Auto-generated method stub
StringBuilder sb=new StringBuilder();
try {
URLConnection conn=arg0[0].openConnection();
BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream(),"gb2312"));
String line="";
while ((line=br.readLine())!=null) {
sb.append(line+"\n");
hasRead++;
publishProgress(hasRead); }
} catch (Exception e) {
// TODO: handle exception
}
return sb.toString();
} @Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
show.setText(result);
progressDialog.dismiss();
} @Override
protected void onPreExecute() {
// TODO Auto-generated method stub
progressDialog=new ProgressDialog(context);
progressDialog.setTitle("任务执行中");
progressDialog.setMessage("敬请等待");
progressDialog.setCancelable(false);
progressDialog.setMax(300);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setIndeterminate(false);
progressDialog.show();
} @Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
show.setText("已读取"+values[0]+"行");
progressDialog.setProgress(values[0]);
} }

  

Android学习之AsyncTask的更多相关文章

  1. 【转】 Pro Android学习笔记(九六):AsyncTask(5):横竖屏切换问题

    目录(?)[-] 横竖屏切换的问题 WeakReference 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flow ...

  2. 【转】 Pro Android学习笔记(九四):AsyncTask(3):ProgressDialog

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ Progress Dialog小例子 我们 ...

  3. 【转】 Pro Android学习笔记(九五):AsyncTask(4):执行情况

    目录(?)[-] 两个AsyncTask对象的运行情况 多次执行的异常 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/ ...

  4. 【转】 Pro Android学习笔记(九三):AsyncTask(2):小例子

    目录(?)[-] 继承AsyncTask UI操作接口 使用AsyncTask 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn. ...

  5. 【转】 Pro Android学习笔记(九二):AsyncTask(1):AsyncTask类

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在Handler的学习系列中,学习了如何h ...

  6. 【转】 Pro Android学习笔记(七四):HTTP服务(8):使用后台线程AsyncTask

    目录(?)[-] 5秒超时异常 AsyncTask 实现AsyncTask抽象类 对AsyncTask的调用 在哪里运行 其他重要method 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注 ...

  7. Android学习路线总结,绝对干货

    title: Android学习路线总结,绝对干货 tags: Android学习路线,Android学习资料,怎么学习android grammar_cjkRuby: true --- 一.前言 不 ...

  8. Android学习系列(37)--App调试内存泄露之Context篇(下)

    接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ...

  9. Android学习笔记之HttpClient实现Http请求....

    PS:最近光忙着考试了....破组成原理都看吐了....搞的什么也不想干...写篇博客爽爽吧....貌似明天就考试了...sad... 学习笔记: 1.如何实现Http请求来实现通信.... 2.解决 ...

随机推荐

  1. Happymenu新的开始

    1. 2014年10月28日入职happymenu,希望能和公司一起成长.年轻的时候就得多折腾! 2. 第一个任务:安装,配置ubuntu14环境,尽快熟悉操作.目前基本工作操作已经掌握. 安装好Ub ...

  2. WPF之 DataGrid数据绑定

    DataGrid控件是显示数据的控件,从一个对象集合获取信息并在具有行和单元格的网格中显示信息.每行和一个单独的对象相对应,并且每列和该对象中的一个属性相对应. DataGrid控件添加了许多在WPF ...

  3. Orleans 高级特性-目录

    这里将介绍一些Orleans的高级特性,适合对Orleans已经有不少了解的用户,先列出一个索引,博客文章慢慢补充 1.使用Immutable 优化复制 2.自定义序列化 (待完成) 3.可重入 Gr ...

  4. Dynamic CRM 2013学习笔记(六)备份和恢复

      这节我们将讨论下怎么维护CRM,包括以下主要内容: 备份CRM DB 备份CRM 系统 恢复CRM DB 恢复 CRM 系统   一. 备份CRM DB 下面的步骤将为CRM DB创建一个维护计划 ...

  5. 解决IIS Express 80端口被占用的情况

    VS2012运行站点的时候提示“无法启动IIS Express Web服务器,端口80正在使用” 于是CMD查看了一下端口使用情况,并且在任务管理器中查看相应的进程,但始终觉得不对,因为显示是Syst ...

  6. 【转】关于Mahalanobis距离的笔记

    Mahalanobis距离是用来度量一个点P和一个分布D之间的距离,它是衡量点P与分布D的均值之间存在多少个标准差的一个多维泛化版本. 如果P就位于分布D的均值处,则该距离为0:该距离随着P的偏离均值 ...

  7. C语言实现二叉树

    二叉树的重要性就不用多说啦: 我以前也学习过,但是一直没有总结: 网上找到的例子,要么是理论一大堆,然后是伪代码实现: 要么是复杂的代码,没有什么解释: 最终,还是靠FQ找到一些好的文章,参考地址我会 ...

  8. 在sublime text 中的Emmet快捷键动态图演示

    Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生.它使用仿CSS选择器的语法来生成代码,大大提高了HTML/CSS代码编写的速度,比如下面的演示: ...

  9. Atitit. 构造ast 语法树的总结attilax v2 q0f

    Atitit. 构造ast 语法树的总结attilax v2 q0f 1. Ast结构树形1 2. ast view (自是个160k的jar )2 2.1. 多条语句ast结构2 2.2. 变量定义 ...

  10. Atitit.javascript 实现类的方式原理大总结

    Atitit.javascript 实现类的方式原理大总结 1. 实现类的式::构造方法方式:原型方式:构造方法+原型的混合方式 1 2. 原型方式(function mode)经典式..实现属性推荐 ...