使用AsyncTask异步任务下载数据

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());//打印解析到的数据
        }
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值