在之前的博客中为大家分享过关于Android多线程处理,想必大家对于Android为什么要使用多线程已经有了清晰的认识,我就在简单唠两句,Android规定UI界面的更新必须在在主线程进行,对于访问网络的耗时操作必须在子线程中执行,所以如果你想成为一名真正的Android开发工程师,多线程是你的必修课。本篇带给大家关于Android为我们封装好的一个简单的线程类AsyncTask。

  AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.对于AsyncTask的详细介绍请大家查看:http://www.cnblogs.com/devinzhang/archive/2012/02/13/2350070.html

  AsyncTask中Android为我们封装了四个方法,具体的介绍请看下图:

  

  看到这里你大概对于AsyncTask已经有了一定的认识,下面我将以一个进度条效果带领大家进一步了解它。

  我们的布局文件activity_main.xml没有太多的控件,仅仅一个水平进度条:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" /> </RelativeLayout>

  我们的主Activity:

public class MainActivity extends Activity {

    private ProgressBar mProgressBar;
private MyAsyncTask mTast; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mProgressBar = (ProgressBar) findViewById(R.id.progressBar1);
mTast = new MyAsyncTask();//创建我们自定义的AsyncTask
mTast.execute(); } //防止我们重新打开时,线程出现等待
@Override
protected void onPause() {
super.onPause();
if(mTast != null && mTast.getStatus() == AsyncTask.Status.RUNNING){
//cancel()方法只是将对应的AsyncTask标记为cancel状态,并不是真正的取消线程的执行。
mTast.cancel(true);
}
} class MyAsyncTask extends AsyncTask<Void, Integer, Void>{ //doInBackground()方法是AsyncTask中四个方法中唯一的不在主线程执行的方法
@Override
protected Void doInBackground(Void... arg0) {
for(int i=; i<; i++){
if(isCancelled()){//判断cancel的状态
break;
}
publishProgress(i);
try {
Thread.sleep();//模拟网络加载
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
} @Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
if(isCancelled()){//判断cancel的状态
return;
}
mProgressBar.setProgress(values[]);
} } }

  代码上没有什么难点,关键部位已经为大家注释,大家如果还有疑问,请留言讨论。

  

最新文章

  1. nginx+fastcgi+c/cpp
  2. Sql Server系列:日期和时间函数
  3. sql语句中----删除表数据drop、truncate和delete的用法
  4. TFS二次开发、C#知识点、SQL知识总结目录
  5. shell 简单计算脚本
  6. 【solr】之solr界面查询返回距离并排序
  7. Python学习路程day1
  8. POJ 3204 Ikki's Story I-Road Reconstruction (网络流关键边)
  9. Unable to make the session state request to the session state server处理方法
  10. JAVA加密算法系列-AES
  11. vue三级联动
  12. Asp.net core 学习笔记 Fluent Validation
  13. 自学python 1.
  14. 51nod--1240莫比乌斯函数 (数论)
  15. re正则匹配使用
  16. php+phpspreadsheet读取Excel数据存入mysql
  17. Valid Sudoku leetcode java
  18. 【Unity笔记】使物体(船)漂浮在水面上——浮力
  19. dbt- 数据构建工具
  20. bzoj4232: [Neerc2011 Northern]Kids Like Cakes

热门文章

  1. [UE4]AnimDynamics简介
  2. Eclipse中支持js提示
  3. 笔记:java转XML
  4. UDP发送中文
  5. 对bit、byte、TByte、Char、string、进制的认识
  6. Alamofire源码学习
  7. zTree的功能解析
  8. android 连接蓝牙扫码枪,程序崩溃之onConfigurationChanged
  9. Use Hibernate core API
  10. 理解一下单片机的I2C和SPI通信