android网络连接,以及接收服务器传来的json数据

7 篇文章 0 订阅
3 篇文章 0 订阅

最近和同学做一个app涉及到联网获取服务器信息,做法是服务器访问数据库操作,获取到数据库中信息,封装成json格式数据,服务器端用的json-lib,json封装起来很方便

		JSONArray jsonArray = JSONArray.fromObject(anList);

		response.getWriter().write(jsonArray.toString());

两句话就能搞定。然而也是android用的是自带的json,就没有那么好用的api了只能自己new对象,然后慢慢解析,中间碰到很多坑,也是自己不注意,就像下面的这个困扰了我好几天,result里边是服务器端传过来的数据,String格式,然后json数据格式很复杂,说一下最容易出错的地方,就是对象定义的地方,像下边的for循环里面要复用的对象要在for循环里面new,如果在外边new,每次for都是操作同一个对象,最后list.add(obj);得到的list就会出错,特别是在下面这种多层for循环,对象的定义就更容易出问题了,出了问题真的是超难找出来,教训就是最好没有完全的必要不要传这么复杂的json,把所有必要的信息可以封装成一个新的对象再传。

    public void init() {

        url = Tool.ip + Tool.webName + "ShowinfoServlet?user_id="+userDataOp.getuser_id();
        new AsyncTask<String, Void, String>() {

            @Override
            protected String doInBackground(String... params) {
                try {
                    httpClient = new DefaultHttpClient();
                    HttpGet httpGet = new HttpGet(url);
                    HttpResponse response = httpClient.execute(httpGet);
                    String value = EntityUtils.toString(response.getEntity());
                    return value;
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onPostExecute(String result) {
                JSONObject json = new JSONObject();
                JSONObject json1 = new JSONObject();
                JSONObject json2 = new JSONObject();
                try {
                    JSONArray ja1 = new JSONArray(result);

                    for(int i=0;i<ja1.length();i++){
                        ArrayList<Announce> announceList = new ArrayList<Announce>();
                        json = ja1.getJSONObject(i);

                        UserOrganize uo = new UserOrganize();
                        uo.setOrganize_id(json.getString("organize_id"));
                        uo.setUo_id(Integer.parseInt(json.getString("uo_id")));
                        uo.setUo_type(Integer.parseInt(json.getString("uo_type")));
                        uo.setUser_id(json.getString("user_id"));

                        json1 = json.getJSONObject("organize");

                        Organize organize = new Organize();
                        organize.setOrganize_id(json1.getString("organize_id"));
                        organize.setOrganize_img(json1.getString("organize_img"));
                        organize.setOrganize_money(json1.getString("organize_money"));
                        organize.setOrganize_note(json1.getString("organize_note"));
                        JSONArray ja3 = json1.getJSONArray("announce");
                        for (int k = 0; k < ja3.length(); k++) {

                            json2 = ja3.getJSONObject(k);

                            Announce announce = new Announce();
                            announce.setAn_id(Integer.parseInt(json2.getString("an_id")));

                            announce.setAn_time(json2.getString("an_time"));
                            announce.setAn_content(json2.getString("an_content"));

                            announce.setOrganize_id(json2.getString("organize_id"));

                            announceList.add(announce);

                        }
                        organize.setAnnounce(announceList);
                        uo.setOrganize(organize);
                        uoList.add(uo);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                lv_an.setAdapter(new MyAdapter());

            }
        }.execute(url);
    }

 

然后,网络传送格式,就是上边代码描述的,使用AsyncTask,doInBackground方法里边是固定的get提交http请求,onPostExecute方法则是处理服务器返回的数据。因为项目网络操作都不复杂,所以统一使用get提交请求,直接将参数写在url,会很方便,doInBackground方法里边的代码也不用改变。最后使用android studio使用org.apache.http的包是需要自己下载jar包手动并导入的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值