修改Handler中消息处理中解析json数据的代码,这次改用GSON方式解析:
1 Gson gson = new Gson(); 2 3 ResponseInfo info = gson.fromJson(str, ResponseInfo.class); 4 5 Toast.makeText(MainActivity.this, info.getErrorCode()+info.getErrorMsg(), Toast.LENGTH_LONG).show();注意到,使用GSON的方式解析到实体类对象非常简单:
没有特别的需求时,使用默认构造创建GSON实例即可,需要特殊的配置时,可以使用GsonBuilder来创建GSON实例,具体参考说明文档
调用fromJson()传入要解析的数据,及解析后的对象类型,即可完成从json格式字符串到实体类对象的解析。
若是json array形式的字符串,解析则稍微麻烦一点:
如:想要解析[{"errorCode":200,"errorMsg":"login success"},{"errorCode":200,"errorMsg":"login success"},{"errorCode":200,"errorMsg":"login success"}]为List<ResponseInfo>
但是不能List<ResponseInfo>.class,这时GSON中提供了获取泛型的类型信息的方法:
使用TypeToken:
TypeToken< List<ResponseInfo>> list = new TypeToken< List<ResponseInfo>>() {};
然后调用list.getType()注意返回的是Type类型的对象,而Gson的fromJson()方法刚好有第二个参数为Type类型的重载形式。
所以,对[{"errorCode":200,"errorMsg":"login success"},{"errorCode":200,"errorMsg":"login success"},{"errorCode":200,"errorMsg":"login success"}]解析的具体代码如下:
1 Gson gson = new Gson(); 2 3 TypeToken<List<ResponseInfo>> list = new TypeToken<List<ResponseInfo>>(){}; 4 5 List<ResponseInfo> info_list = gson.fromJson(str, list.getType());
以上,就是两种对json形式数据的解析方式。
与服务器交互的方式除了内置的HttpURLConnection和HttpClient之外,还可以选择一些优秀的开源项目,来简化与服务端交互的工作,如使用AsyncHttpClient:
AsyncHttpClient可以到github上获取:
在github中搜说async-http即可找到该项目,然后clone或者下载zip包就可以获得该项目了。
在自己的项目中使用async-http的方式如同GSON,也可以直接使用源码,或者引用jar包,根据个人喜好即可。
简单演示下async-http发送get和post请求的示例:
在MainActivity中添加两个方法:
使用AsyncHttpClient发送get请求:
async_get_test(){ 2 3 String username = et_username.getText().toString(); 4 5 String password = et_password.getText().toString(); 6 7 AsyncHttpClient client = new AsyncHttpClient(); 8 9 client.get("http://10.0.2.2/index.php?username="+username+"&password="+password, new AsyncHttpResponseHandler() { @Override onSuccess(int statusCode, Header[] headers, byte[] responseBody) { Message msg = new Message(); 20 21 msg.what = OK; 22 23 msg.obj = new String(responseBody); 24 25 handler.sendMessage(msg); 26 27 } @Override onFailure(int statusCode, Header[] headers, [] responseBody, Throwable error) { Message msg = new Message(); 40 41 msg.what = OK; 42 43 msg.obj = new String(responseBody); 44 45 handler.sendMessage(msg); 46 47 } 48 49 }); 50 51 }使用AsyncHttpClient发送post请求:
async_post_test(){ 2 3 String username = et_username.getText().toString(); 4 5 String password = et_password.getText().toString(); 6 7 AsyncHttpClient client = new AsyncHttpClient(); 8 9 RequestParams params = new RequestParams(); 10 11 params.add("username", username); 12 13 params.add("password", password); 14 15 client.post("http://10.0.2.2/index.php", params , new AsyncHttpResponseHandler() { @Override onSuccess(int statusCode, Header[] headers, byte[] responseBody) { Message msg = new Message(); 26 27 msg.what = OK; 28 29 msg.obj = new String(responseBody); 30 31 handler.sendMessage(msg); 32 33 } @Override onFailure(int statusCode, Header[] headers, [] responseBody, Throwable error) { Message msg = new Message(); 46 47 msg.what = OK; 48 49 msg.obj = new String(responseBody); 50 51 handler.sendMessage(msg); 52 53 } 54 55 }); 56 57 }
可以看到使用AsyncHttpClient的方式非常简单:
get方式:
创建AsyncHttpClient对象,然后调用get方法即可。
唯一稍微复杂的就是get方法的第二个参数:AsyncHttpResponseHandler,需要创建一个匿名内部类对象,然后重写AsyncHttpResponseHandler的两个方法,分别是网络请求成功的回调方法及网络请求失败的回调方法。
post方式:
就比get方式多了一个传递参数而已:
RequestParams params = new RequestParams();
params.add("username", username);
params.add("password", password);
使用RequestParams对象存放要提交的参数,然后将其传递给post()方法即可。