我们在《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. cygwin下清屏的三种方法

    1. 做一个clear脚本,放到/bin下去 $vim /bin/clear #!/bin/bash cmd /c cls 2. ctrl + L 3. 在cygwind中install ncurse ...

  2. 利用dbms_metadata.get_ddl查看DDL语句

    http://www.cnblogs.com/aocle/archive/2011/10/13/2209790.html 当我们想要查看某个表或者是表空间的DDL的时候,可以利用dbms_metada ...

  3. Zabbix3.0 自动电话报障

    第一种:Pagerduty 网站:www.pagerduty.com 优点:老牌服务商,稳定 缺点:贵,英文,网站要FQ 价格参考(34美元每月才25个电话,*29每月是包年才有的价格) 安装方式: ...

  4. 【概念笔记】JAVA基础 - part2

    IT`huhiu前言录 这是续JAVA基础 - part1 链接http://www.cnblogs.com/ithuhui/p/5922067.html的. 笔记慢慢在修改和补充 JAVA里面重要的 ...

  5. 跟我一起学WCF(4)——第一个WCF程序

    一.引言 前面几篇文章分享了.NET 平台下其他几种分布式技术,然而前面几种分布式技术专注于某一特定的领域,并且具有不同编程接口,这使得开发人员需要掌握多个API的使用.基于这样的原因,微软在.NET ...

  6. windows平台下redis安装及配置文件介绍

    1.redis介绍 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(s ...

  7. Android开发学习总结(五)——Android应用目录结构分析

    一.手动创建android项目 手动创建一个Android项目,命名为HelloWorld,命令如下: android create project -n HelloWorld -t -p E:/An ...

  8. grunt使用小记之uglify:最全的uglify使用DEMO

    grunt-contrib-uglify uglify是一个文件压缩插件,项目地址:https://github.com/gruntjs/grunt-contrib-uglify 本文将以一个DEMO ...

  9. [自娱自乐] 3、超声波测距模块DIY笔记(三)

    前言 上一节我们已经研究了超声波接收模块并自己设计了一个超声波接收模块,在此基础上又尝试用单片机加反相器构成生成40KHz的超声波发射电路,可是发现采用这种设计的发射电路存在严重的发射功率太低问题,对 ...

  10. 【Android 】Service 全面总结

    1.Service的种类 按运行地点分类: 类别 区别  优点 缺点   应用 本地服务(Local) 该服务依附在主进程上,  服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外L ...