一:什么是AsyncTask
AsyncTask异步任务类。比Handle更轻量级,更适合简单的异步的操作。内部封装了Handle,在使用AsyncTask进行刷新控件的刷新操作时,不需要再额外创建声明Handle,可以直接使用AsyncTask内部封装号的几个方法实现。
二:AsyncTask参数介绍
AsyncTaskAsyncTask<Params,Progress,Result>
Params:开始异步任务执行时传入的参数类型,对应excute()中转递的参数
Progress:异步任务执行过程中,返回下载进度值的类型(可以为空)
Result:异步任务执行完成后,返回的结果类型,与doInBackground()的返回类型保持一致
三:AsyncTask方法介绍
1.execute():执行一个异步任务
2.onPreExecute():操作前的准备工作,不经常使用
3.doInBackground():耗时操作,请求服务器
4.onProgressUpdate():更新进度
5.onPostExecute():执行完后台任务后更新ui显示结果
6.onCancelled():取消执行
四:案例介绍,最终显示
1.MainActivity代码
package com.hanjie.asynctask_2021_0412;
import androidx.appcompat.app.AppCompatActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.channels.AsynchronousChannelGroup;
//请求服务器,将响应显示到界面
public class MainActivity extends AppCompatActivity {
private Button btn;
private TextView txt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = findViewById(R.id.btn);
txt = findViewById(R.id.tv_txt);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//实例化AsyncTask
MyTask task = new MyTask();
//启动
task.execute("http://www.imooc.com/api/teacher?type=3&cid=1");
}
});
}
//execute方法的参数:通常如果是请求服务的话,那么这个参数我们会传入服务器接口的地址
//http://www.imooc.com/api/teacher?type=3&cid=1
public class MyTask extends AsyncTask<String,Void,String>{
@Override
protected void onPreExecute() {
super.onPreExecute();
Log.e("hanjie","执行了onPreExecute");
}
//请求服务器
@Override
protected String doInBackground(String... strings) {
Log.e("hanjie","执行了doInBackground");
try {
URL url = new URL(strings[0]);
//2.获取一个HttpURLConnection实例
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//3.设置和请求相关的属性
//请求方式
conn.setRequestMethod("GET");
//请求时长
conn.setConnectTimeout(6000);
//4.获取响应码
if(conn.getResponseCode()==HttpURLConnection.HTTP_OK){
//5.判断响应码并获取响应数据
//获取响应的流
InputStream in = conn.getInputStream();
byte[] b = new byte[1024];
int len = 0;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//循环中读取输入流
//in.read(b):返回int类型,代表的实际读到的数据长度
while ((len=in.read(b))>-1){
//参数1:待写入的数组
//参数2:起点
//参数3:长度
baos.write(b,0,len);
}
String msg = new String(baos.toByteArray());
Log.i("hanjie",msg);
return msg;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
//再ui中显示结果
@Override
protected void onPostExecute(String s) {
Log.e("hanjie","执行了onPostExecute");
super.onPostExecute(s);
if (s!=null){
txt.setText(s);
}
}
}
}
2.activity_main布局代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="点击启动异步任务,开始请求服务器"
/>
<TextView
android:layout_marginStart="10dp"
android:id="@+id/tv_txt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="hanjie"
android:textSize="32sp"/>
</LinearLayout>