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线程中被加载,该异步任务也只能执行一次,如果执行两次的话就会报错。

 

posted @ 2013-11-04 17:53  小小缘  阅读(362)  评论(0编辑  收藏  举报