1.使用异步任务的原因:
①.android 4.0开始主线程不能执行耗时任务(网络连接,数据库访问,文件的读取)。
不能在主线程执行的原因:
android的主线程也叫UI线程,专门响应用户的点击事件等,必须能够快速的响应。
网络连接容易堵塞,UI线程超过5s没有响应用户请求,会弹出无响应关闭对话框提醒用户终止应用程序。
②子线程不能修改UI,所以就有了异步任务来处理数据。
2.同步与异步的区别:
同步:一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;
异步:进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,提高执行的效率。
异步执行顺序:先执行子线程的方法doInBackground(),得到结果,传到主线程。再执行主线程onPostExcite();跟新UI。
代码展示:
1.MainActivity的代码:
private void downloadData() {
String urlString ="http://www.51kan.com.cn/lolservice/newlolitemsbytype.jsp?type=attack&start=0";
// String urlString = "http://api.1-blog.com/biz/bizserver/xiaohua/list.do?size=20&page=0";
MyAsyncTask task = new MyAsyncTask(new OnTaskCompletedListneter() {
@Override
public void onTaskCompleted(List<Lol> lolList) {
//把返回的结果添加到List集合中,并通知适配器更新
//lolList.addAll(lolList);
// adapter.notifyDataSetChanged();
Log.i("下载解析完返回的数据:",lolList.toString());
}
});
task.execute(urlString);
}
}
2.MyAsyncTask 类的代码:
public class MyAsyncTask extends AsyncTask<String,Void,List<Lol>> {
//自定义一个接口,监听器,并把结果返回
public interface OnTaskCompletedListneter{
void onTaskCompleted(List<Lol> lolList);
}
//构造方法
private OnTaskCompletedListneter listneter;
MyAsyncTask(OnTaskCompletedListneter listneter){
this.listneter = listneter;
}
//先执行子线程的方法doInBackground(),在这个方法执行耗时操作
@Override
protected List<Lol> doInBackground(String... strings) {
//1. 连接网络,进行下载
String urlString = strings[0];
String jsonString = HttpUril.downloadString(urlString);
Log.i("下载到的数据",jsonString);
//进行解析
List<Lol> retList = JsonParser.parse(jsonString);
return retList;
}
//下载解析到结果,再执行主线程onPostExcite(),传到主线程。跟新UI。
@Override
protected void onPostExecute(List<Lol> retList) {
if(listneter!=null&&retList!=null){
listneter.onTaskCompleted(retList);
Log.i("解析到的数据",retList.toString());//打印解析到的数据
}
}
}