一, 什么是异步任务
使用子线程执行耗时的操作, 然后通过回调把结果返回给主线程
二, 为什么要使用异步任务
1, android 使用线程的规则:
1.1 主线程(UI线程)不能被阻塞, 不能执行耗时的操作
1.2 子线程(非UI线程)可以执行耗时的操作, 它不能操作UI线程
2, Handler是线程间的通信, 将子线程的数据传递给主线程显示
Android已经实现了这种线程间的通信, 这个类就是AsyncTask
三, 如何使用异步任务
1, 定义一个类,继承AsyncTask, 同时声明3个泛型
public class MyTask extends AsyncTask<Params,Progress,Result>
没有返回类型: Void
第一个泛型: 子线程执行任务的请求参数类型
第二个泛型: 子线程执行任务的进度
第三个泛型: 子线程执行任务的结果返回类型
2, 重写核心的方法(4个)
//运行在主线程中, 负责初始化的工作(进度条对话框的初始)
protected void onPreExecute()
//运行在子线程中,执行耗时的操作
protected byte[] doInBackground(String... Params)
{
//将当前的下载进度发布到ui线程中, 执行此方法后, 系统自动调用onProgressUpdate
publishProgress(int progress);
}
//运行在主线程中, 实时更新进度条
protected void onProgressUpdate(Integer... values)
//运行在主线程中, 更新UI (在doInBackground()方法执行后, 由系统自动调用)
protected void onPostExecute(byte[] result)
3, 启动异步任务(必须在主线程中启动)
new MyTask().execte(String... Params);
4, 在主线程中取消异步任务
myTask.cancel(true);
四, ProgressDialog 进度条对话框
包含了ProgressBar的对话框
有两种展示方式: 模糊的, 精确的
ProgressDialog pd = new ProgressDialog();
pd.setIcon(R.drawable.f001);
pd.setTitle("设置标题");
pd.setMessage("设置内容");
pd.setCancelable(true/false);//设置是否可撤销,默认为true 可撤销的
pd.show();//显示对话框 (加载数据之前)
pd.dismiss();// 对话框消失 (加载数据结束)
五, 设置控件是否可见
1, 属性
android:visibility = ""
属性值: visible 可见
invisible 不可见(控件看不见, 但是位置依然占用)
gone 不可见(不占用当前位置)
2, 代码
progressBar.setVisibility(View.GONE);
View.VISIBLE
View.INVISIBLE
View.GONE
进度条类型 在xml中 写style?Android
六 AsyncTask注意事项
1, 必须在UI线程中得到AsyncTask的对象
2, 必须在UI线程中启动异步任务
3, 重新父类的4个核心方法, 这些方法都是系统自动调用, 不需要手动调用
4, 每个AsyncTask 的实例只能被使用一次, 不能重复使用,否则会抛出异常
5, 如果异步任务获取的数据需要和用户交互, 则使用, 否则开启线程
使用子线程执行耗时的操作, 然后通过回调把结果返回给主线程
二, 为什么要使用异步任务
1, android 使用线程的规则:
1.1 主线程(UI线程)不能被阻塞, 不能执行耗时的操作
1.2 子线程(非UI线程)可以执行耗时的操作, 它不能操作UI线程
2, Handler是线程间的通信, 将子线程的数据传递给主线程显示
Android已经实现了这种线程间的通信, 这个类就是AsyncTask
三, 如何使用异步任务
1, 定义一个类,继承AsyncTask, 同时声明3个泛型
public class MyTask extends AsyncTask<Params,Progress,Result>
没有返回类型: Void
第一个泛型: 子线程执行任务的请求参数类型
第二个泛型: 子线程执行任务的进度
第三个泛型: 子线程执行任务的结果返回类型
2, 重写核心的方法(4个)
//运行在主线程中, 负责初始化的工作(进度条对话框的初始)
protected void onPreExecute()
//运行在子线程中,执行耗时的操作
protected byte[] doInBackground(String... Params)
{
//将当前的下载进度发布到ui线程中, 执行此方法后, 系统自动调用onProgressUpdate
publishProgress(int progress);
}
//运行在主线程中, 实时更新进度条
protected void onProgressUpdate(Integer... values)
//运行在主线程中, 更新UI (在doInBackground()方法执行后, 由系统自动调用)
protected void onPostExecute(byte[] result)
3, 启动异步任务(必须在主线程中启动)
new MyTask().execte(String... Params);
4, 在主线程中取消异步任务
myTask.cancel(true);
四, ProgressDialog 进度条对话框
包含了ProgressBar的对话框
有两种展示方式: 模糊的, 精确的
ProgressDialog pd = new ProgressDialog();
pd.setIcon(R.drawable.f001);
pd.setTitle("设置标题");
pd.setMessage("设置内容");
pd.setCancelable(true/false);//设置是否可撤销,默认为true 可撤销的
pd.show();//显示对话框 (加载数据之前)
pd.dismiss();// 对话框消失 (加载数据结束)
五, 设置控件是否可见
1, 属性
android:visibility = ""
属性值: visible 可见
invisible 不可见(控件看不见, 但是位置依然占用)
gone 不可见(不占用当前位置)
2, 代码
progressBar.setVisibility(View.GONE);
View.VISIBLE
View.INVISIBLE
View.GONE
进度条类型 在xml中 写style?Android
六 AsyncTask注意事项
1, 必须在UI线程中得到AsyncTask的对象
2, 必须在UI线程中启动异步任务
3, 重新父类的4个核心方法, 这些方法都是系统自动调用, 不需要手动调用
4, 每个AsyncTask 的实例只能被使用一次, 不能重复使用,否则会抛出异常
5, 如果异步任务获取的数据需要和用户交互, 则使用, 否则开启线程