除了Handler,其实Android提供了另外一个类: AsyncTask, 也就是异步任务
2.1. 首先我们把第一个泛型改成 String,
new MyAsyncTask().execute("http://www.baidu.com");
private class MyAsyncTask extends AsyncTask<String, Integer, String> {...}
发现 doInBackground 和 onPostExecute 都报错了
第三个泛型是 doInBackground 的返回值类型, 也是 onPostExecute 的参数类型
用法如下:
1. 基本用法:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 执行异步任务
new MyAsyncTask().execute();
}
/**
* 使用AsyncTask, 需要创建一个 AsyncTask 的子类, 注意泛型, 这里可以先传Void
*
*/
private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
// 执行异步任务之前调用
@Override
protected void onPreExecute() {
super.onPreExecute();
// 此方法在主线程中运行
}
// 在子线程中运行, 可以做耗时操作
@Override
protected Void doInBackground(Void... params) {
// 此方法在子线程中运行
return null;
}
// 异步任务执行完后调用
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
// 此方法在主线程中运行
}
}
}
2. 三个泛型的含义
2.1. 首先我们把第一个泛型改成 String,
private class MyAsyncTask extends AsyncTask<String, Void, Void>{...}
此时 doInBackground 会报错, 第一个泛型其实是 doInBackground 方法的参数类型
@Override
protected Void doInBackground(String... params) {
// 此方法在子线程中运行
// 获取方法参数
System.out.println(params[0]);
return null;
}
那么这个参数的值是从哪里传过来呢? 是在执行异步任务的时候传入的:
new MyAsyncTask().execute("http://www.baidu.com");
2.2. 把第二个泛型改为 Integer,
private class MyAsyncTask extends AsyncTask<String, Integer, Void> {...}
发现没有哪里报错, 这第二个泛型的用法如下:
protected Void doInBackground(String... params) {
// 此方法在子线程中运行
System.out.println(params[0]);
for (int i = 0; i < 10; i++) {
SystemClock.sleep(500);
// 更新进度, 第二个泛型其实是这个方法的参数类型
publishProgress(i);
}
return null;
}
// 当在 doInBackground 中调用 publishProgress 后, 这个方法会被调用
// 这个方法也是在主线程中调用的, 用于更新进度, 参数类型是第二个泛型类型
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
System.out.println(values[0]);
}
2.3. 把第三个泛型也改为 String,
private class MyAsyncTask extends AsyncTask<String, Integer, String> {...}
发现 doInBackground 和 onPostExecute 都报错了
第三个泛型是 doInBackground 的返回值类型, 也是 onPostExecute 的参数类型
用法如下:
@Override
protected ArrayList<String> doInBackground(String... params) {
// 此方法在子线程中运行
System.out.println(params[0]);
for (int i = 0; i < 10; i++) {
SystemClock.sleep(500);
// 此方法用于更新进度, 第二个泛型其实是这个方法的参数类型
publishProgress(i);
}
// 假设这个方法里从网络获取数据成功
return "成功";
}
// 方法参数就是 doInBackground 的返回值
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
// 此方法在主线程中运行
System.out.println(result);
}