结构

java.lang.Object

        android.os.AsyncTask<Params, Progress, Result>

描述

AsyncTask能够适当地、简单地用于 UI线程。这个类不需要操作线程(Thread)就可以完成后台操作将结果返回UI。

异步任务的定义是一个在后台线程上运行,其结果是在 UI线程上发布的计算。 异步任务被定义成三种泛型类型: ParamsProgressResult;和四个步骤: begin , doInBackgroundprocessProgress end

AysncTask必须被继承使用。子类至少覆盖一个方法 (doInBackground(Params...)),最经常覆盖另一个(onPostExecute(Result).)

AsyncTask的泛型类型

这三个类型被用于一个异步任务,如下:

1. Params启动任务执行的输入参数

2. Progress后台任务执行的百分比

3. Result,后台计算的结果类型

在一个异步任务里,不是所有的类型总被用。假如一个类型不被使用,可以简单地使用 Void类型:

private class Mytask extends AsyncTask< void,void,void>{...}

4个步骤

当一个异步任务被执行,任务经过四各步骤:

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

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

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

4onPostExecute(Result), 当后台计算结束时,调用 UI线程。后台计算结果作为一个参数传递到这步。 

线程规则

有一些线程规则必须去遵守,这个类才会正确的工作:

·         任务实例必须创建在 UI线程

·         execute(Params...)必须在 UI线程上调用

·         不要手动调用onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...)

·         这个任务只执行一次(如果执行第二次将会抛出异常)

//layout布局

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout 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:paddingLeft="@dimen/activity_horizontal_margin"

    android:paddingRight="@dimen/activity_horizontal_margin"

    android:paddingTop="@dimen/activity_vertical_margin"

    android:orientation="vertical"

    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">


    <TextView

        android:id="@+id/tv1"

        android:text=" AsyncTask Test!"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content" />

    <ProgressBar

        android:id="@+id/pbar"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        style="?android:attr/progressBarStyleHorizontal"

        />

    <Button

        android:id="@+id/btn1"

        android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="启动"

        android:textSize="20sp"/>

</LinearLayout>



代码

package com.example.test.testasynctask;


import android.os.AsyncTask;

import android.widget.ProgressBar;

import android.widget.TextView;


/**

 * Created by Administrator on 15-11-19.

 */

public class ProgressBarAsynctask extends AsyncTask<Integer,Integer,String>

{

    private  TextView textView;

    private  ProgressBar progressBar;

    public ProgressBarAsynctask(TextView textView,ProgressBar progressBar)

    {

        this.textView =textView;

        this.progressBar =progressBar;



    }

    /**

     * 这里的String s参数对应AsyncTask中的第三个参数(也就是接收doInBackground的返回值)

     * 在doInBackground方法执行结束之后在运行,并且运行在UI线程当中 可以对UI空间进行设置

     */

    @Override

    protected void onPostExecute(String s) {

        textView.setText("异步操作执行结束" + s);

      //  super.onPostExecute(s);

    }


    //该方法运行在UI线程当中,并且运行在UI线程当中 可以对UI空间进行设置

    @Override

    protected void onPreExecute() {

        textView.setText("开始异步执行");

    //    super.onPreExecute();

    }


    /**

     * 这里的Intege参数对应AsyncTask中的第二个参数

     * 在doInBackground方法当中,,每次调用publishProgress方法都会触发onProgressUpdate执行

     * onProgressUpdate是在UI线程中执行,所有可以对UI空间进行操作

     */

    @Override

    protected void onProgressUpdate(Integer... values) {


        int nValue = values[0];

        progressBar.setProgress(nValue);

        float fvalue;

        fvalue=nValue;

        fvalue =fvalue/100;

        textView.setText("完成"+fvalue*100+"%");

     //   super.onProgressUpdate(values);

    }


    /**

     * 这里的Integer参数对应AsyncTask中的第一个参数

     * 这里的String返回值对应AsyncTask的第三个参数

     * 该方法并不运行在UI线程当中,主要用于异步操作,所有在该方法中不能对UI当中的空间进行设置和修改

     * 但是可以调用publishProgress方法触发onProgressUpdate对UI进行操作

     */

    @Override

    protected String doInBackground(Integer... params) {


        int i=0;

        for( i =10;i<=100;i+=10)

        {

            try {

                Thread.sleep(1000);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

            publishProgress(i);

        }

        return i+params[0].intValue()+"";

    }

}

package com.example.test.testasynctask;


import android.os.Bundle;

import android.support.v7.app.ActionBarActivity;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.widget.Button;

import android.widget.ProgressBar;

import android.widget.TextView;

import android.widget.Toast;


public class MainActivity extends ActionBarActivity {


    public Button btn1;

    public ProgressBar pbar;

    public TextView tv1;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        btn1 =(Button)findViewById(R.id.btn1);

        pbar =(ProgressBar)findViewById(R.id.pbar);

        tv1 =(TextView)findViewById(R.id.tv1);

        btn1.setOnClickListener(new mybtn1OnclickListener());


    }


    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.

        getMenuInflater().inflate(R.menu.menu_main, menu);

        return true;

    }


    @Override

    public boolean onOptionsItemSelected(MenuItem item) {

        // Handle action bar item clicks here. The action bar will

        // automatically handle clicks on the Home/Up button, so long

        // as you specify a parent activity in AndroidManifest.xml.

        int id = item.getItemId();


        //noinspection SimplifiableIfStatement

        if (id == R.id.action_settings) {

            return true;

        }


        return super.onOptionsItemSelected(item);

    }


    class mybtn1OnclickListener implements View.OnClickListener

    {


        @Override

        public void onClick(View v) {


            Toast.makeText(MainActivity.this,"tishi",Toast.LENGTH_LONG).show();

            ProgressBarAsynctask myasynctask =new ProgressBarAsynctask(tv1,pbar);

            myasynctask.execute(100);


        }

    }

}

//代码下载

http://down.51cto.com/data/2120675