Android的UI线程主要负责处理用户的按键事件、用户触屏事件及屏幕触屏绘图事件等,因此开发者的其他操作不应该、也不能阻塞UI线程,不要在UI线程执行一些耗时操作。
AsyncTask<>是一个抽象类,通常用于被继承,继承AsyncTask时需要指定如下三个泛型参数。
AsyncTask是抽象类,它定义了如下三种类型:
1、Params:启动任务执行的输入参数的类型;
2、Progress:后台任务完成的进度值的类型;
3、Result:后台执行任务完成后返回值的类型。
使用AstncTask只要如下三步即可:
1、创建AsyncTask的子类,并为三个泛型参数指定类型,如果某个泛型不需要指定类型,可以指定为void.
2、根据需要,实现AsyncTask的提供的方法。
3、调用AsyncTask子类实例的execute(Params... params)开始执行耗时任务。
代码
```package com.example.asynctasktest;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
public class MainActivity extends Activity {
private TextView show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
show = (TextView) findViewById(R.id.main_text);
}
public void download(View source) throws MalformedURLException{
DownTask task = new DownTask(this);
task.execute(new URL("http://www.crazyit.org/ethos.php"));
}
class DownTask extends AsyncTask<URL, Integer, String>{
ProgressDialog pdialog;
int hasRead = 0;
Context mContext;
public DownTask(Context ctx){
mContext = ctx;
}
//后台线程将要完成的任务
@Override
protected String doInBackground(URL... params) {
StringBuilder sb = new StringBuilder();
try {
//网络连接
URLConnection conn = params[0].openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
String line = null;
while((line = br.readLine()) != null){
sb.append(line + "n");
hasRead++;
//调用该方法就会触动onProgressUpdate()方法
publishProgress(hasRead);
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//当doInBackground()运行结束时,将返回值传递给该方法
@Override
protected void onPostExecute(String result) {
show.setText(result);
pdialog.dismiss();
}
//在执行耗时操作时调用
@Override
protected void onPreExecute() {
pdialog = new ProgressDialog(mContext);
//设置对话框的标题
pdialog.setTitle("任务正在执行中");
//设置对话框显示的内容
pdialog.setMessage("任务正在执行中,敬请等待...");
//设置对话框不能用取消按钮关闭
pdialog.setCancelable(false);
//设置进度条的最大进度值
pdialog.setMax(202);
//设置对话框的进度条风格
pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
//设置对话框的进度条是否显示进度
pdialog.setIndeterminate(false);
pdialog.show();
}
@Override
protected void onProgressUpdate(Integer... values) {
//更新进度
show.setText("已经读取了【" + values[0] + "】行!");
pdialog.setProgress(values[0]);
}
}
}