Android中AsyncTask异步任务使用详细实例(一)
AsyncTask是Android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程。
使用AsyncTask最少要重写以下两个方法:
1、doInBackground(Params…)后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
2、onPostExecute(Result)在这里面可以使用在doInBackground得到的结果处理操作UI。此方法在主线程执行,任务执行的结果作为此方法的参数返回。
MainActivity如下:
packagecom.example.asynctasktest;
importjava.io.ByteArrayOutputStream;
importjava.io.InputStream;
importorg.apache.http.HttpEntity;
importorg.apache.http.HttpResponse;
importorg.apache.http.HttpStatus;
importorg.apache.http.client.HttpClient;
importorg.apache.http.client.methods.HttpGet;
importorg.apache.http.impl.client.DefaultHttpClient;
importandroid.app.Activity;
importandroid.os.AsyncTask;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.ProgressBar;
importandroid.widget.TextView;
importandroid.widget.Toast;
publicclassMainActivityextendsActivity{
privateButtonsatrtButton;
privateButtoncancelButton;
privateProgressBarprogressBar;
privateTextViewtextView;
privateDownLoaderAsyncTaskdownLoaderAsyncTask;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initView();
}
publicvoidinitView(){
satrtButton=(Button)findViewById(R.id.startButton);
cancelButton=(Button)findViewById(R.id.cancelButton);
satrtButton.setOnClickListener(newButtonOnClickListener());
cancelButton.setOnClickListener(newButtonOnClickListener());
progressBar=(ProgressBar)findViewById(R.id.progressBar);
textView=(TextView)findViewById(R.id.textView);
}
privateclassButtonOnClickListenerimplementsOnClickListener{
publicvoidonClick(Viewv){
switch(v.getId()){
caseR.id.startButton:
//注意:
//1每次需new一个实例,新建的任务只能执行一次,否则会出现异常
//2异步任务的实例必须在UI线程中创建
//3execute()方法必须在UI线程中调用。
downLoaderAsyncTask=newDownLoaderAsyncTask();
downLoaderAsyncTask.execute("http://www.baidu.com");
break;
caseR.id.cancelButton:
//取消一个正在执行的任务,onCancelled()方法将会被调用
downLoaderAsyncTask.cancel(true);
break;
default:
break;
}
}
}
//构造函数AsyncTask<Params,Progress,Result>参数说明:
//Params启动任务执行的输入参数
//Progress后台任务执行的进度
//Result后台计算结果的类型
privateclassDownLoaderAsyncTaskextendsAsyncTask<String,Integer,String>{
//onPreExecute()方法用于在执行异步任务前,主线程做一些准备工作
@Override
protectedvoidonPreExecute(){
super.onPreExecute();
textView.setText("调用onPreExecute()方法--->准备开始执行异步任务");
System.out.println("调用onPreExecute()方法--->准备开始执行异步任务");
}
//doInBackground()方法用于在执行异步任务,不可以更改主线程中UI
@Override
protectedStringdoInBackground(String...params){
System.out.println("调用doInBackground()方法--->开始执行异步任务");
try{
HttpClientclient=newDefaultHttpClient();
HttpGetget=newHttpGet(params[0]);
HttpResponseresponse=client.execute(get);
if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK){
HttpEntityentity=response.getEntity();
InputStreamis=entity.getContent();
longtotal=entity.getContentLength();
ByteArrayOutputStreambos=newByteArrayOutputStream();
byte[]buffer=newbyte[1024];
intcount=0;
intlength=-1;
while((length=is.read(buffer))!=-1){
bos.write(buffer,0,length);
count+=length;
//publishProgress()为AsyncTask类中的方法
//常在doInBackground()中调用此方法
//用于通知主线程,后台任务的执行情况.
//此时会触发AsyncTask中的onProgressUpdate()方法
publishProgress((int)((count/(float)total)*100));
//为了演示进度,休眠1000毫秒
Thread.sleep(1000);
}
returnnewString(bos.toByteArray(),"UTF-8");
}
}catch(Exceptione){
returnnull;
}
returnnull;
}
//onPostExecute()方法用于异步任务执行完成后,在主线程中执行的操作
@Override
protectedvoidonPostExecute(Stringresult){
super.onPostExecute(result);
Toast.makeText(getApplicationContext(),"调用onPostExecute()方法--->异步任务执行完毕",0).show();
//textView显示网络请求结果
textView.setText(result);
System.out.println("调用onPostExecute()方法--->异步任务执行完毕");
}
//onProgressUpdate()方法用于更新异步执行中,在主线程中处理异步任务的执行信息
@Override
protectedvoidonProgressUpdate(Integer...values){
super.onProgressUpdate(values);
//更改进度条
progressBar.setProgress(values[0]);
//更改TextView
textView.setText("已经加载"+values[0]+"%");
}
//onCancelled()方法用于异步任务被取消时,在主线程中执行相关的操作
@Override
protectedvoidonCancelled(){
super.onCancelled();
//更改进度条进度为0
progressBar.setProgress(0);
//更改TextView
textView.setText("调用onCancelled()方法--->异步任务被取消");
System.out.println("调用onCancelled()方法--->异步任务被取消");
}
}
}
main.xml如下:
<LinearLayoutxmlns: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:orientation="vertical"> <Button android:id="@+id/startButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="开始异步任务"/> <Button android:id="@+id/cancelButton" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="取消异步任务"/> <ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyleHorizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:max="100" android:progress="0"/> <ScrollView android:id="@+id/scrollView" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/textView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="testtest"/> </ScrollView> </LinearLayout>
以上内容是小编给大家介绍的Android中AsyncTask异步任务使用详细实例(一),希望对大家有所帮助!