Java Android客户端开发

          基于JAVA的 Android客户端应用开发中的问题-------------服务器传值和客户端解析中的那些事儿

       刚开始学习android开发,对于整个框架和android中的技术都还衰,所以在开发的时候各种问题;对于大多数的应用都会牵扯到后台服务器的交互问题--------服务器发送数据和客户端接收数据。本次开发虽然是4人合作完成,但是对于服务器端,我们则是每人都做了一份,后来使用了其中一人的代码。因为前期的服务端实属于一个web的B/S应用,我们在借用了那个服务端后,需要进行微小的修改才能使其与android客户端进行数据交互。而我在本次android的开发中,目前的工作则是主要负责客户端和服务器端得数据交互。

     由于JAVA的水平太烂,所以我们写服务端的时候就单纯的使用了struts来做,对于android一样是没用什么技术,单纯使用json传送数据,不过我们借用了google的Gson jar包(因为确实好用多了)。这样以来,我们客户端和服务器的数据交互就显得有点繁琐。说了很多废话,下面说说实际的问题吧:

     android客户端想服务器发送数据时,因为服务器使用struts,所以我们就和web上的数据发送一样,将客户端发送的数据以Map<String,String>的形式,只要确保Map的键很服务器端的数据名称一致就ok了。这样服务器就可以得到客户端的数据了,而服务器在对客户端的数据进行验证后还需要给客户端发送应答。这块本来是用struts可以直接将返回数据通过Json让客户端得到,但是这块没成功,所以就还是使用了原始的显式发送数据包的方式。而且单纯的JSON类好像不是很好用,测试几次都没成功,所以就放弃了。。。大神要是成功了求教呀!!      

好了,代码如下:

服务器端:
Class UserInfo{
    private String userName;
    private Date birthday;
    private int height;

    //本来是想直接返回的,但是没成功代码就没改
    private Map<String,Object> res=new HashMap<String,Object>();

    各个属性的set和get方法;

    public String Validate(){
       String  flag=ERROR;
       result.clear();
       在这里各个属性就是客户端发送的数据,可以直接进行验证。
       if(成功)  res.put("res","success");
       else     res.put("res","error");
       //调用发送的工具类
      
       SendMessage.sendMsg(res);
       res.clear();
       return flag;
    }

    public String getAll_Data(){
     String flag=ERROR;
     //将发送的所有UserInfo的数据存入userInfoList。
     List<UserInfo> userInfoList=从数据库拿出数据;
     List<Object> jsonList=new ArrayList<Object>();    
 
     Gson gson=new GsonBuilder().setDateFormat().create();

     for(int i=0;i<userInfoList.size();i++)
        jsonList.add(gson.toJson(userInfoList.get(i)));
     res.put("res",jsonList);</span>

     SendMessage.sendMsg(res);
     res.clear();
     flag=SUCCESS;
     return flag;
   }
 }


class final SendMessage{
  private final static void sendMsg(Object obj){
    JSONObject json=JSONObject.fromObject(obj);
        byte[] jsonMsg;
        try {
            jsonMsg = json.toString().getBytes("UTF-8");
            response=ServletActionContext.getResponse();
            response.setCharacterEncoding("UTF-8");
            response.setContentType("json/text;charSet=UTF-8");
            response.setContentLength(jsonMsg.length);
            response.getOutputStream().write(jsonMsg);
            response.getOutputStream().flush();
            response.getOutputStream().close();
        } catch (UnsupportedEncodingException e){
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
  }
}



<pre name="code" class="java">android客户端:

<span style="font-size:12px;">class  MainActivity{
    public void onCreate(){
    前面的什么各种加载界面就不说了,现在界面上有三个交互的数据框,在提交按钮的监听事件里做如下代码;
    <span style="color:#FF0000;">发送数据:</span>
    Map<String,String> param =new HashMap<String,String>();
    param.put("userName",第一个数据框的值);
    param.put("birthday",第二个数据框的值);
</span><pre name="code" class="java"><span style="font-size:12px;">    param.put("height",第三个数据框的值);
    
   //使用工具类发送数据给服务器并得到json
   Gson gson=new GsonBuilder().setDateFormat().cretae();</span>
   <span style="font-size:12px;">
</span><p><span style="font-size:12px;">String url1=HttpUtils.BASE_URL + 调用的服务端的strut中的action的name名字;</span></p><span style="font-size:12px;">
String json1=HttpUtil.postRequest(url1,param);
JSONObject js1=new JSONObject(new JSONObject(json1).getString("res"));
//客户端得到了服务器回发的验证信息


String url2=HttpUtils.BASE_URL + 调用的服务端的strut中的action的name名字;

<span style="color:#FF0000;">List<UserInfo> userList=new ArrayList<UserInfo>();
String json2=HttpUtil.getRequest(url2);
JSONObject js2=new JSONObject(json2);
JSONAraay jsonArray=js2.getJsonArray(“res”);
for(int i=0;i<jsonArray.length();i++){
UserInfo user=gson.fromJson(jsonArray.get(i).toString,UserInfo.class); 
userList.add(user);
}</span>
//客户端就得到服务器发送的数据了
}

工具类:
public class HttpUtils {
//服务端的url
    public static String BASE_URL = "http://127.0.0.1:8080/ProductManagmentSystem/";
    public static HttpClient httpClient = new DefaultHttpClient();

    public static String getRquest(String url) throws ClientProtocolException,
    IOException {
        HttpGet get = new HttpGet(url);
        get.addHeader("Accept", "text/json");
        HttpResponse httpResponse = httpClient.execute(get);
        if (httpResponse.getStatusLine().getStatusCode() == 200) {
            HttpEntity httpEntity = httpResponse.getEntity();
            String json = EntityUtils.toString(httpEntity, "UTF-8");
            return json;
        }
        return null;
    }

    public static String postRequest(String url,Map<String, String> param) throws ClientProtocolException, IOException, URISyntaxException{
        HttpPost post = new HttpPost(url);
        post.addHeader("Accept", "text/json");
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        for (String nameValuePair : param.keySet()) {
            params.add(new BasicNameValuePair(nameValuePair, param.get(nameValuePair)));
        }
        post.setEntity(new UrlEncodedFormEntity(params,"UTF-8"));
        HttpResponse httpResponse = httpClient.execute(post);
        if(httpResponse.getStatusLine().getStatusCode()==200){
            HttpEntity httpEntity = httpResponse.getEntity();
            String json = EntityUtils.toString(httpEntity, "UTF-8");
            return json;
        }

        return null;
    }
}</span>


 

 
 

          对于整个过程中遇到的问题很多,主要有两个问题卡了我很长时间,第一个是发送数据时,刚开始直接用JSON,但是不成功,或许是我代码的问题,但是我使用了神器Gson;第二个问题是数据传送过程中,Date类型的传送;刚开始我以为数据传送完全就可以使用Gson不加修饰的发送和接受,但是客户端老是没法正常解析数据,因此我卡了好久,最后发现时Date类型传送和解析时要使用相同的格式才能完整的解析数据,否则可能在解析的时候就出错了!目前就遇到这么多问题,本人水水,求讨论,别喷呀!!!! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值