一、AsyncTask

①AsyncTask的源码:

public abstract class AsyncTask<Params, Progress, Result>

三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型”。

②相关的方法:

一个异步任务的执行一般包括以下几个步骤:

1.execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。

2.onPreExecute(),在execute(Params... params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记。

3.doInBackground(Params... params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。

4.onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。

5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。

在使用的时候,有几点需要格外注意:

1.异步任务的实例必须在UI线程中创建。

2.execute(Params... params)方法必须在UI线程中调用。

3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。

4.不能在doInBackground(Params... params)中更改UI组件的信息。

5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。

(注:找资料的时候,看到挺详细的挺不错。  以上面内容转自:http://blog.csdn.NET/liuhe688/article/details/6532519)

二、案例

1、首先我们创建一个名为multithreadcho1的项目:

实现功能:

点击一个按钮,每隔3秒跟新一行item数据,进度条也显示,更新玩数据后改变TextView控件的值。

activity_main.xml布局文件:

    <TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" /> <Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView1"
android:layout_marginLeft="72dp"
android:layout_toRightOf="@+id/textView1"
android:text="test" />
<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/button1"
android:layout_marginTop="84dp" >
</ListView> <ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/listView1"
android:layout_alignRight="@+id/button1"
android:layout_below="@+id/button1"
android:layout_marginTop="28dp" />

图片:

item.xml布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" > <TextView
android:id="@+id/username"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="25dp"
android:textSize="25dp"
/> <TextView
android:id="@+id/sex"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="25dp"
android:textSize="25dp"
/>
</LinearLayout>

图片:

这两个TextView用来显示姓名和性别。

首先创建一个Userinfos类用来封装表的,添加两个字段  Name 和Sex。

Userinfos.java文件:

MainActivity.java文件:

public class MainActivity extends Activity {
private SimpleAdapter sa;
private Button btn;
private TextView tv;
private List<Userinfos> list=new ArrayList<Userinfos>();
private BaseAdapter adapter;
private ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
//这里是UI主线程
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); for (int i = 0; i < 5; i++) {
Userinfos u = new Userinfos();
u.setName("小明"+i);
u.setSex("男"+i);
list.add(u);
}
lv=(ListView)this.findViewById(R.id.listView1);
tv=(TextView)findViewById(R.id.textView1);
btn=(Button)findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener(){ //模拟数据访问产生数据
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Take tk=new Take(MainActivity.this);
tk.execute(list,adapter);//参数是传给doInBackground
}});
adapter=new BaseAdapter(){ @Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
} @Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
} @Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
LayoutInflater inflater = MainActivity.this.getLayoutInflater();
View vw; if(convertView==null)
{
Log.i("View","创建对象");
vw = inflater.inflate(R.layout.item, null); }
else
{
vw=convertView;
}
TextView tv_username = (TextView)vw.findViewById(R.id.username);
TextView tv_sex = (TextView)vw.findViewById(R.id.sex);
tv_username.setText(list.get(position).getName());
tv_sex.setText(list.get(position).getSex());
return vw; }}; lv.setAdapter(adapter);
}

创建一个Take类继承AsyncTask,进行异步任务操作。

Take.java文件:

public class Take extends AsyncTask{
private MainActivity activity;
private BaseAdapter adapter;
private List<Userinfos> list=new ArrayList<Userinfos>();
protected Take(MainActivity activity)
{
this.activity=activity;
}
//后台运行(数据库,蓝牙,互联网)
@Override
protected Object doInBackground(Object... params) {
// TODO Auto-generated method stub
list = (List<Userinfos>) params[0];
Log.i("list",""+list.size());
adapter = (BaseAdapter) params[1]; for(int i=0;i<list.size();i++)
{
publishProgress(i); //这里的参数类型是 AsyncTask<Void, Integer, Void>中的Integer决定的,
//在onProgressUpdate中可以得到这个值去更新UI主线程,这里是异步线程 。
Log.i("time","休眠");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
list.get(i).setName("小红"+i);
list.get(i).setSex("女"+i); } return "天气:22度";
}
//准备
@Override
protected void onPreExecute() {
Toast.makeText(activity, "今晚有约", Toast.LENGTH_SHORT).show();
super.onPreExecute();
}
//做完后执行
@Override
protected void onPostExecute(Object result) {
//result的值为doInBackground方法的返回值
String tr=result.toString();
TextView tv = (TextView)activity.findViewById(R.id.textView1);
tv.setText("访问完成!"+tr);
// TODO Auto-generated method stub
super.onPostExecute(result);
}
//分步完成
//onProgressUpdate更新进度条
@Override
protected void onProgressUpdate(Object... values) {
// TODO Auto-generated method stub
Log.i("dd","进入分步");
int bar= Integer.parseInt(values[0].toString());
bar=(bar+1)*20;
ProgressBar progressBar = (ProgressBar)activity.findViewById(R.id.progressBar1);
progressBar.setProgress(bar);
adapter.notifyDataSetChanged();
//这里是UI主线程
}
}

1、通过继承AsyncTask,进行相关异步任务操作

2、调用 publishProgress(i)方法进入onProgressUpdate进度条更新的方法,通过BaseAdapter的notifyDataSetChanged()方法通知更新数据。

3、数据更新完后进入onPostExecute方法,该方法的result参数的值为doInBackground方法的返回值,我们固定让它返回字符串。

4、将doInBackground方法返回的值赋给TextView。

效果图片:

               

AsyncTask(异步任务)的更多相关文章

  1. Android线程管理之AsyncTask异步任务

    前言: 前面几篇文章主要学习了线程以及线程池的创建与使用,今天来学习一下AsyncTask异步任务,学习下AsyncTask到底解决了什么问题?然而它有什么弊端?正所谓知己知彼百战百胜嘛! 线程管理相 ...

  2. AsyncTask异步交互和httpurlconnection结合使用

    //网络请求数据 package com.baidu.myutils; import java.io.BufferedReader; import java.io.InputStreamReader; ...

  3. Android多线程分析之五:使用AsyncTask异步下载图像

    Android多线程分析之五:使用AsyncTask异步下载图像 罗朝辉 (http://www.cnblogs.com/kesalin) CC 许可,转载请注明出处 在本系列文章的第一篇<An ...

  4. 使用AsyncTask异步更新UI界面及原理分析

    概述: AsyncTask是在Android SDK 1.5之后推出的一个方便编写后台线程与UI线程交互的辅助类.AsyncTask的内部实现是一个线程池,所有提交的异步任务都会在这个线程池中的工作线 ...

  5. Android 多线程----AsyncTask异步任务详解

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  6. android AsyncTask异步下载并更新进度条

    AsyncTask异步下载并更新进度条    //如果不是很明白请看上篇文章的异步下载 AsyncTask<String, Integer, String> 第一个参数:String 传入 ...

  7. Android中使用Thread线程与AsyncTask异步任务的区别

    最近和几个朋友交流Android开发中的网络下载问题时,谈到了用Thread开启下载线程时会产生的Bug,其实直接用子线程开启下载任务的确是很Low的做法,那么原因究竟如何,而比较高大上的做法是怎样? ...

  8. Android异步处理系列文章四篇之二 使用AsyncTask异步更新UI界面

    Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+Loope ...

  9. Android使用AsyncTask异步线程网络通信获取数据(get json)

    摘要: android 4.0以上强制要求不能在主线程执行耗时的网络操作,网络操作需要使用Thead+Handler或AsyncTask,本文将介绍AsyncTask的使用方法. 内容: 1.添加Ht ...

  10. Android异步处理二:使用AsyncTask异步更新UI界面

    在<Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面>中,我们使用Thread+Handler的方式实现了异步更新UI界面,这一篇中,我们介绍一种更为简 ...

随机推荐

  1. Android测试(四)——内容供应器泄露

    内容供应器:用来存储和查询应用程序中的数据或来自电话的数据,所有内容供应器都具有唯一的统一的资源标识符(URI)以便被识别和查询. 内容供应期命名惯例:以content://开始 当Android A ...

  2. linux安装elasticsearch及遇到的各种问题

    1.获取elasticsearch https://www.elastic.co/downloads/elasticsearch 终端输入赋值的下载链接进行下载 wget https://artifa ...

  3. js 数组的pop(),push(),shift(),unshift()方法小结

    关于数组的一些操作方法小结: pop(),push(),shift(),unshift()四个方法都可改变数组的内容以及长度: 1.pop() :删除数组的最后一个元素,并返回被删除的这个元素的值: ...

  4. [sgu P155] Cartesian Tree

    155. Cartesian Tree time limit per test: 0.25 sec. memory limit per test: 65536 KB input: standard i ...

  5. 20175227张雪莹 2018-2019-2 《Java程序设计》第五周学习总结

    20175227张雪莹 2018-2019-2 <Java程序设计>第五周学习总结 教材学习内容总结 第六章接口与实现 接口 接口体中所有的常量访问权限一定是public和static(可 ...

  6. [Leetcode 18]四数之和 4 Sum

    [题目] Given an array nums of n integers and an integer target, are there elements a, b, c, and d in n ...

  7. ubuntu 安装 nvm 管理Node.js 以及vim 插件增强

    安装curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bashsource ~/.bashr ...

  8. Angular2 NgModule 模块详解

    原文  https://segmentfault.com/a/1190000007187393 我们今天要学习的是Angular2的模块系统,一般情况下我们使用一个根模块去启动我们的应用,然后使用许多 ...

  9. [Go back to REDIS]

    Overview 内存中的数据结构存储系统,可以用作数据库.缓存和消息中间件. redis底层数据结构:跳跃表 [为什么选skiplist而不是red-black tree] 支持多种数据结构:Str ...

  10. noj二分查找

    二分查找: 要么左边,要么右边,哈哈哈哈 描述 给定一个单调递增的整数序列,问某个整数是否在序列中.   输入 第一行为一个整数n,表示序列中整数的个数:第二行为n(n不超过10000)个整数:第三行 ...