您的位置:首页 > 移动开发 > Android开发

AsyncTask使用

2015-11-20 17:26 701 查看
结构
java.lang.Object android.os.AsyncTask<Params, Progress, Result>
描述

AsyncTask能够适当地、简单地用于 UI线程。这个类不需要操作线程(Thread)就可以完成后台操作将结果返回UI。
异步任务的定义是一个在后台线程上运行,其结果是在 UI线程上发布的计算。 异步任务被定义成三种泛型类型: Params,Progress和 Result;和四个步骤: begin , doInBackground,processProgress 和end。AysncTask必须被继承使用。子类至少覆盖一个方法
(doInBackground(Params...)),最经常覆盖另一个(onPostExecute(Result).)AsyncTask的泛型类型
这三个类型被用于一个异步任务,如下:
1. Params,启动任务执行的输入参数2. Progress,后台任务执行的百分比3. Result,后台计算的结果类型在一个异步任务里,不是所有的类型总被用。假如一个类型不被使用,可以简单地使用 Void类型:private class Mytask extends AsyncTask< void,void,void>{...}

4个步骤
当一个异步任务被执行,任务经过四各步骤:
1.onPreExecute(),在UI线程上调用任务后立即执行。这步通常被用于设置任务,例如在用户界面显示一个进度条。2.doInBackground(Params...),后台线程执行onPreExecute()完后立即调用,这步被用于执行较长时间的后台计算。异步任务的参数也被传到这步。计算的结果必须在这步返回,将传回到上一步。在执行过程中可以调用publishProgress(Progress...)来更新任务的进度。3.onProgressUpdate(Progress...),一次呼叫 publishProgress(Progress...)后调用 UI线程。执行时间是不确定的。这个方法用于当后台计算还在进行时在用户界面显示进度。例如:这个方法可以被用于一个进度条动画或在文本域显示记录。4.onPostExecute(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  androidstudio AsyncT