异步任务AsyncTask
什么是异步任务?
逻辑上:以多线程的方式完成的功能需求
API上:指AsyncTask类
AsyncTask的理解
在没有AsyncTask之前,我们用Handler+Thread就可以实现异步任务的功能需求
AsyncTask是对Handler和Thread的封装,使用它更编码更简洁,更高效
AsyncTask封装了ThreadPool,比直接使用Thread效率要高
API
AsyncTask
简化Handler处理多线程通信的问题
AsyncTask<Params,Progress,Result>
Params启动任务执行的输入参数,比如HTTP请求的URL。
Progress后台任务执行的百分比。
Result后台执行任务最终返回的结果,比如String。
execute(Params...params)
启动任务,开始任务的执行流程
void onPreExecute()
在分线程工作开始之前在UIThread中执行,一般用来显示提示视图
Result dolnBackground(Params..…params)
在workerThread中执行,完成任务的主要工作,通常需要较长的时间
void onPostExecute(Result result)
在dolnBackground()执行完后在UIThread中执行,一般用来更新界面
publishProgress(Progress...values)
在分线程中,发布当前进度
void oriProgressUpdate(Progress...values)
在主线程中更新进度
执行流程

代码实例
activity实例
package xlr.com.asynctask;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
MainActivity.MyTask myTask;
// 主布局中的UI组件
Button button; // 加载、取消按钮
public TextView text; // 更新的UI组件
ProgressBar progressBar; // 进度条
//异步处理
public class MyTask extends AsyncTask<String, Integer, String> {
//处理流程
@Override
protected void onPreExecute() {
。。。。。。。
}
@Override
protected String doInBackground(String... strings) {
publishProgress(Parm。。。。parm);
。。。。。。。
}
@Override
protected void onProgressUpdate(Integer... values) {
。。。。。。。
}
@Override
protected void onPostExecute(String s) {
。。。。。。。
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取布局元素
button = (Button) findViewById(R.id.button);
text = (TextView) findViewById(R.id.text);
progressBar = (ProgressBar) findViewById(R.id.progress_bar);
//创建静态内部类
myTask = new MainActivity.MyTask();
//通过点击开启异步处理
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//开启处理方法
myTask.execute();
}
});
}
}
MyTask实例(以获取页面源码为例)
//异步处理
public class MyTask extends AsyncTask<String, Integer, String> {
String resut;
//用于界面初始化
@Override
protected void onPreExecute() {
text.setText("loading...");
}
//执行任务
@Override
protected String doInBackground(String... strings) {
try {
//1). 得到path, 并带上参数name=Tom1&age=11
String path = "http://192.168.152.2/";
//2). 创建URL对象
URL url = new URL(path);
//3). 打开连接, 得到HttpURLConnection对象]
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
//4). 设置请求方式,连接超时, 读取数据超时
httpURLConnection.setRequestMethod("GET");
httpURLConnection.setConnectTimeout(5000);
httpURLConnection.setReadTimeout(6000);
//5). 连接服务器
httpURLConnection.connect();
//6). 发请求, 得到响应数据
//得到响应码, 必须是200才读取
int code = httpURLConnection.getResponseCode();
if (code == 200) {
InputStream in = httpURLConnection.getInputStream();
//得到InputStream, 并读取成String
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[12];
int len = -1;
while ((len = in.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, len);
// 可调用publishProgress()显示进度, 之后将执行onProgressUpdate()
publishProgress(len);
// 模拟耗时任务
Thread.sleep(50);
}
resut = byteArrayOutputStream.toString();
System.out.println(resut);
byteArrayOutputStream.close();
in.close();
}
httpURLConnection.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
//在主线程显示线程任务执行的进度
@Override
protected void onProgressUpdate(Integer... values) {
progressBar.setProgress(values[0]);
text.setText("loading..." + values[0] + "%");
}
//线程结束后更新界面组件
@Override
protected void onPostExecute(String s) {
// 执行完毕后,则更新UI
text.setText(resut);
button.setVisibility(View.VISIBLE);
button.setClickable(false);
}
}

浙公网安备 33010602011771号