1.AsyncTask 的特点:
a.通过开源框架 Conncurrent(并发的框架) 框架来管理匿名线程 ,该框架是非常成熟框架
b.内部有一个线程池,通过线程池来管理线程
c.假如同一时段要开辟多个子线程,可以排队开辟子线程
d. AsyncTask封装了四个方法,可以很好实现子线程与主线程通信
e.AsyncTask内部也是采用Handler进行通信
2.AsyncTask 的三个泛型参数,四个封装的方法:
三个泛型参数:
(1)Params: 传递过来的参数 : 影响的参数 AsyncTask.execute(params)—>doInBackground(String… params)
(2)Progress: 进度参数 :publishProgress(Integer …values)—–>onProgressUpdate(Integer[] values)
(3)Result : 结果参数 :Uri doInBackground() 返回参数—–>onPostExecute(Uri result) 的输入参数
四个方法:
(1) 方法的执行顺序:onPreExecute –》 doInBackground –》 onPostExecute
(2)publishProgress: 发布进行,该方法应该在子线性执行(doInBackground) ==>onProgressUpdate。如果用户想要知道某一任务的进度的话,则需要调用此方法。
3.代码示例:
(1)需要展示进度的AsyncTask :中间参数不能为Void了
public class MainActivity extends Activity {
private ProgressBar mProgressBar;
private Button progresstextButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mProgressBar = (ProgressBar) findViewById(R.id.progressbar);
progresstextButton = (Button) findViewById(R.id.progress);
mProgressBar.setVisibility(View.INVISIBLE);
}
// 点击启动按钮,开始访问网络
public void start(View view) {
DownloadTask task = new DownloadTask();
task.execute();
}
private class DownloadTask extends AsyncTask<Void, Integer, Void> {
@Override
protected void onPreExecute() {
// todo:显示近乎条,进度状态展示:
super.onPreExecute();
mProgressBar.setVisibility(View.VISIBLE);
progresstextButton.setText("当前进度0%");
}
private int progressValue = 0;
@Override
protected Void doInBackground(Void... params) {
// 子线程执行:模拟访问网络:
for (int i = 1; i <= 100; i++) {
SystemClock.sleep(100);
// 更新进度值:
progressValue = i;
// 将进度值提交给界面:
publishProgress(progressValue);
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
// 调用此方法的话必须调用publishProgress(处理message)
super.onProgressUpdate(values);
// button 显示进度状态更新:已经将progressValue传递到values中了
int value = values[0];
mProgressBar.setProgress(value);
progresstextButton.setText("当前进度" + value + "%");
}
@Override
protected void onPostExecute(Void result) {
// 隐藏进度条
super.onPostExecute(result);
mProgressBar.setVisibility(View.INVISIBLE);
}
}
}
效果展示:
(2) 不需要展示进度的AsyncTask :中间参数为Void,并且不需要调用onProgressUpdate了。
匿名开辟AsyncTask:
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
String url = "http://xxxxxxxxxxxxxxxxx";
String json = HttpUtil.get(url, "utf-8");
LogUtil.i("hxy", json);
homeData = JSON.parseObject(json, HomeData.class);
homeBannerItem = homeData.home_banner;
homeItemList = homeData.home_classlist;
//遍历集合并往imageurls中添加数据:大图用的picture
for(home_banner_item item:homeBannerItem){
imageUrls.add(item.pic);
}
//遍历集合往往item项目中添加数据:拿到title,picture
for(home_classlist_item listItem:homeItemList){
titleItems.add(listItem.title);
}
return null;
}
protected void onPostExecute(Void result) {
//为mViewPager 装载数据:
if(adapter==null){
adapter = new MyPageAdapter(homeBannerItem);
mViewPager.setAdapter(adapter);
}else{
adapter.notifyDataSetChanged();
}
//为mListView装配数据:
BaseAdapter adapter1 = new MyBaseAdapter(homeItemList);
mListView.setAdapter(adapter1);
};
}.execute();
单独定义一个AsyncTask类:
DataTask task = new DataTask(this);
task.execute(url);
public class DataTask extends AsyncTask<String, Void, Object>{
@Override
protected void onPreExecute() {
super.onPreExecute();
// TODO:UI界面的展示
}
//访问网络必须在子线程
@Override
protected Object doInBackground(String... params) {
try {
String json=HttpUtil.get(params[0], "utf-8");
//TODO 解析json的代码:
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Object result) {
// TODO 更新UI界面的代码
super.onPostExecute(result);
}
}
4.注意AsyncTask的线程规则:
a.AsyncTask类必须在UI线程加载
b.AsyncTask.execute()必须在UI线性执行
c.四个封装方法不能手动回调,应该由框架来回调
d.任务只能执行一次,假如有不同的任务,再重新的new一个AsyncTask实例