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