zoukankan      html  css  js  c++  java
  • AsyncTask实现异步任务

          在33guide项目中取网络数据用的最多的是异步,也就是AsyncTask,其实就是从网络中取一段JSON格式的数据,在AsyncTask实现的方法中解析以及绑定数据到页面上去,其实网上已经有很多讲述关于AsyncTask的文章的,大致都是一样的,但是每个人学习的心得都是不同的,所以我也就讲讲我的心得。

    页面布局我是用的ListView,在onCreate中最好是以方法的形式调用

    //订单列表初始化
    public void orderInit(){
       orderlistview=(ListView)findViewById(R.id.showorderlistview); //查找listView
       int uid=getName.registerID;//用户ID
       new getorderList(uid).execute(); //执行异步
       //订单详细信息(ListView的点击事件)
       orderlistview.setOnItemClickListener(new myitemonclick());
    }

    AsyncTask实现的方法
              //获取会员订单列表
    class getorderList extends AsyncTask<String, String, Object>{
     4         private ProgressDialog dialog;//进程框,提示作用
     5         private int uid;//用户的id,我是根据id取用户的订单
     6         public getorderList(int uid) {//通过构造方法传递参数
     7             super();
     8             this.uid = uid;
     9         }
    10         public getorderList() {super();}        
    11         @Override
    12         protected Object doInBackground(String... params) {
    13             Object obj=null;
    14             HashMap<String,Object> map=new HashMap<String,Object>();
    15             map.put("type", "orderlist");
    16             map.put("id", uid+"");
    17             obj=HttpConn.getValues(map, "提交到你的网络接口中去");
    18             return obj;
    19         }
    20         @Override
    21         protected void onPostExecute(Object result) {
    22             
    23             super.onPostExecute(result);
    24             if(olist==null)
    25                 olist=new ArrayList<Order>();
    26             olist=ParseJson.parseJSONByOrderList(result.toString());//JSON格式的解析
    //绑定到ListView中去
    27 if(olist!=null&&olist.size()>0){ 28 adapter=new loadorderlistadapter(olist);//适配器 29 orderlistview.setAdapter(adapter);//绑定适配器 30 adapter.notifyDataSetChanged(); //刷新适配器 31 }else{ 32 Toast.makeText(UserOrderListActivity.this, "未查詢到任何的訂單信息", Toast.LENGTH_SHORT).show(); 33 } 34 dialog.dismiss();//关闭进程框 35 } 36 37 @Override 38 protected void onPreExecute() { 39 super.onPreExecute();
    //提示作用的进程框
    40 dialog=new ProgressDialog(UserOrderListActivity.this); 41 dialog.setIndeterminate(true); 42 dialog.setCancelable(true); 43 dialog.show(); 44 } 45 }

    这里是我的JSON解析

    //查询订单列表
        public static List<Order> parseJSONByOrderList(String json){
            List<Order> olist=new ArrayList<Order>();
            try {
                JSONObject obj=new JSONObject(json);//因为返回的JSON格式是一个对象,所以用JSONObject
                int status=obj.getInt("status");//解析状态
                if(status==1){
                    JSONArray list=obj.getJSONArray("data");//开始解析正文,返回的是数组格式,因为一个用户可以下很多的订单
                    for (int i = 0; i < list.length(); i++) {
                        //开始解析对象
    Order oo
    =new Order(); oo.setOid(list.getJSONObject(i).getString("virtuemart_order_id")); oo.setTotleprice(list.getJSONObject(i).getString("order_total")); oo.setOdate(list.getJSONObject(i).getString("created_on")); oo.setOstatus(list.getJSONObject(i).getString("order_status_name")); oo.setModified_on(list.getJSONObject(i).getString("modified_on")); oo.setOrdernumber(list.getJSONObject(i).getString("order_number")); //加入集合 olist.add(oo); } return olist; }else if(status==2){ Toast.makeText(UserOrderListActivity.orderlistmain, "參數不正確", Toast.LENGTH_SHORT).show(); }else if(status==3){ System.out.println("传递的用户id没有交易记录或者不存在"); //Toast.makeText(UserOrderListActivity.orderlistmain, "传递的用户id没有交易记录或者不存在", Toast.LENGTH_SHORT).show(); } } catch (Exception e) { e.printStackTrace(); } return null; }

    AsyncTask的用法

    写一个类继承AsyncTask 带三个参数,参数类型自己定义,第一个参数启动任务是执行的参数,第二个参数是进程框的百分比,第三个参数是后台计算的结果类型

    使用AsyncTask至少实现一个方法,默认是doInBackground(params....)

    我一般会实现三个方法,也就是1、doInBackground   2、onPostExecute    3、onPreExecute我觉得这几个方法之间有一定的顺序,所以一直觉得挺好用的,比如说我在doInBackground  中访问网路,返回的是一段json格式的字符串,然后将这个json字符串传入到onPostExecute去解析,然后将解析后的数据绑定到ListView中去,在此方法中可以更新UI线程,当然,在未完成这些操作之前方法onPreExecute自动会调用,提示进程(数据正在加载中),完成之后记得关闭进程提示dismiss()。

    其实实现异步操作的还有另外一个方法就是Thread+Handler,此方法原理和AsyncTask也差不多,AsyncTask方法其实也就是Thread+Handler的封装。在AsyncTask中更新的数据是安全的。

    需要注意的是:AsyncTask的实现类必须在UI线程中被加载,该异步任务也只能执行一次,如果执行两次的话就会报错。

    经验的积累在于平时的点滴、
  • 相关阅读:
    设计模式之简单数据工厂
    Linux CPU affinity
    QT操作Excel(通过QAxObject使用了OLE,前提是本地安装了Excel)
    QT 4.2.2的安装(安装完还要再编译,注意设置Windows Path)
    你要看透的56条人生哲理(还可以)
    提升Delphi编程效率必须使用的快捷键(Delphi2007版本)
    Delphi中复制带有String的记录结构时不能使用Move之类的内存操作函数
    普林斯顿大学算法公开课(1)----介绍
    iOS7 初体验
    SQL Server 性能优化之——系统化方法提高性能
  • 原文地址:https://www.cnblogs.com/yrhua/p/3407155.html
Copyright © 2011-2022 走看看