android基础笔记——AsyncTask

原创 2015年01月26日 21:53:50

AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程。

这个类不需要操作线程(Thread)就可以完成后台操作将结果返回UI。


AsyncTask定义了三种泛型类型 Params,Progress和Result。

Params:启动任务执行的输入参数,比如HTTP请求的URL。
Progress:后台任务执行的百分比。
Result:后台执行任务最终返回的结果,比如String。


AsyncTask的执行步骤大致分为:

1.onPreExecute():在UI线程上调用任务后立即执行。这步通常被用于设置任务,例如在用户界面显示一个进度条。

2.doInBackground(Params...):后台线程执行onPreExecute()完后立即调用,这步被用于执行较长时间的后台计算。异步任务的参数也被传到这步。计算的结果必须在这步返回,将传回到上一步。在执行过程中可以调用publishProgress(Progress...)来更新任务的进度。

3.onProgressUpdate(Progress...):调用 publishProgress(Progress...)后,在UI线程中执行。执行时间是不确定的。这个方法用于当后台计算还在进行时在用户界面显示进度。例如:这个方法可以被用于一个进度条动画或在文本域显示记录。

4.onPostExecute(Result):当后台计算结束时,在 UI线程中执行。后台计算结果作为一个参数传递到这步。


使用AsyncTask类,以下是几条必须遵守的准则:

1、Task的实例必须在UI thread中创建;

2、execute方法必须在UI thread中调用;

3、不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;

4、该task只能被执行一次,否则多次调用时将会出现异常;


举例:

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="无内容" />

    <ProgressBar
        android:id="@+id/progressbar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="更新" />

</LinearLayout>

MainActivity

package com.example.asynctask;

import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBar;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.os.Build;

public class MainActivity extends ActionBarActivity {

	private Button button;
	private ProgressBar progressBar;
	private TextView textView;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		textView = (TextView) findViewById(R.id.textview);
		progressBar = (ProgressBar) findViewById(R.id.progressbar);
		button = (Button) findViewById(R.id.button);

		button.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				myAsyncTask asyncTask = new myAsyncTask(textView, progressBar);
				// 在UI线程中执行asyncTask
				asyncTask.execute(1000);
			}
		});

	}

}

myAsyncTask

package com.example.asynctask;

import android.R.integer;
import android.os.AsyncTask;
import android.widget.ProgressBar;
import android.widget.TextView;

/**
 * 生成该类的对象,并调用execute方法之后 
 * 首先执行的是onProExecute方法 
 * 其次执行doInBackgroup方法
 * 期间为了更新progressBar,调用onProgressUpdate 
 * 执行完成之后调用onPostExecute
 * 
 */
public class myAsyncTask extends AsyncTask<Integer, Integer, String> {
	private TextView textView;
	private ProgressBar progressBar;

	public myAsyncTask(TextView textView, ProgressBar progressBar) {
		this.textView = textView;
		this.progressBar = progressBar;
	}


    /**  
     * 这里的Integer参数对应AsyncTask中的第一个参数   
     * 这里的String返回值对应AsyncTask的第三个参数  
     * 该方法并不运行在UI线程当中,主要用于异步操作,所以在该方法中不能对UI当中的控件进行设置和修改  
     * 但是可以调用publishProgress方法触发onProgressUpdate对UI进行操作  
     */  
	@Override
	protected String doInBackground(Integer... params) {
		// TODO Auto-generated method stub
		netOperator operator = new netOperator();
		int i = 0;
		for (i = 10; i <= 100; i += 10) {
			operator.operator();
			publishProgress(i);
		}
		return i + params[0].intValue() + "";

	}

    /**  
     * 这里的Intege参数对应AsyncTask中的第二个参数  
     * 在doInBackground方法当中,,每次调用publishProgress方法都会触发onProgressUpdate执行  
     * onProgressUpdate是在UI线程中执行,所有可以对UI控件进行操作  
     */  
	@Override
	protected void onProgressUpdate(Integer... values) {
		// TODO Auto-generated method stub
		int value = values[0];
		progressBar.setProgress(value);
		// super.onProgressUpdate(values);
	}

	// 该方法在asyncTask执行前调用,运行在UI线程当中,可以对UI控件进行设置
	@Override
	protected void onPreExecute() {
		// TODO Auto-generated method stub
		textView.setText("开始执行异步线程");
	}


    /**  
     * 这里的String参数对应AsyncTask中的第三个参数(也就是接收doInBackground的返回值)  
     * 在doInBackground方法执行结束之后在运行,并且运行在UI线程当中 可以对UI控件进行设置  
     */  
	@Override
	protected void onPostExecute(String result) {
		// TODO Auto-generated method stub
		textView.setText("异步线程执行完毕");
	}
}

Android学习笔记:Android异步任务之AsyncTask基础

AsyncTask是Android为了简化异步操作而封装的异步任务操作抽象类。当我们需要在程序中执行耗时的异步操作时,我们可以考虑使用AsyncTask来实现。 那么Android中为什么需要异步任...
  • true100
  • true100
  • 2015年09月21日 14:06
  • 930

安卓基础到入门学习(复习笔记)

一、Android 基本常识1、写 10 个简单的 linux 命令mkdir 创建文件夹 rmdir 删除文件夹 rm 删除文件 mv 移动文件 cp 拷贝文件 cat 查看文件 tail 查看文件...
  • android_ty
  • android_ty
  • 2016年05月06日 11:18
  • 1908

完整学习笔记之Android基础(详版)

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...
  • Liliqianbaidu
  • Liliqianbaidu
  • 2017年04月27日 14:48
  • 800

android基础笔记

拨打电话 Intent类                 //系统统一调用程序的一个类         String number="13138794688";         Intent inte...
  • u014352836
  • u014352836
  • 2015年05月25日 21:29
  • 570

Android 基础笔记

1,android开发入门教程 2,精通android3 develeper.android. 3, add-ons 附件的包 docs android html格式的离线文档 plato...
  • huanxingxyzaaa
  • huanxingxyzaaa
  • 2014年05月08日 12:37
  • 388

Android实现弱引用AsyncTask,将内存泄漏置之度外。

AsyncTask可谓是在Android中隐藏很深,曾经叱咤风云的功夫级人物。它的存在让网络和UI的通信变得异常简单和轻松。AsyncTask使用上的简单也得以让很多开发者青睐。一般情况下,Async...
  • u013718120
  • u013718120
  • 2016年11月04日 11:50
  • 2883

android 取消AsyncTask继续运行的解决方案

问题 当进入一个详细页面,这时程序会弹出一个对话框加载网络数据,可是发现用户经常因为数据加载慢,就快速的退出这个页面,这样反复来回几次后,发现AsyncTask不再继续加载,而是慢慢的等待,查了下个...
  • u011467537
  • u011467537
  • 2015年12月08日 10:25
  • 1772

源码解析Android中AsyncTask的工作原理

在之前的博客《Android中AsyncTask使用详解》中我们提到AsyncTask是对Thread和Handler的组合包装,本文将通过解析的方式让大家了解AsyncTask的工作原理。Async...
  • sunqunsunqun
  • sunqunsunqun
  • 2016年02月17日 23:03
  • 9999

Android AsyncTask 源码解析

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38614699,本文出自:【张鸿洋的博客】1、概述相信大家对AsyncTask都不...
  • lmj623565791
  • lmj623565791
  • 2014年08月18日 09:10
  • 29132

Android之AsyncTask的内存泄露问题

AsyncTask是Android提供的一种用于异步处理数据的异步类,使用AsyncTask可以不用直接使用Thread和Handler来处理后台操作。AsyncTask被引入到Android中就被贴...
  • LoveYaozu
  • LoveYaozu
  • 2016年04月25日 22:41
  • 2828
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android基础笔记——AsyncTask
举报原因:
原因补充:

(最多只允许输入30个字)