调试了三种通信方法:HttpClient、AsyncHttpClient 和 Volley 。

HttpClient 测试代码[1]

public class HttpUtil {

    public static void sendRequestWithHttpClient(final String address, final List<NameValuePair> params, final HttpCallbackListener listener)
{
new Thread(new Runnable(){ @Override
public void run(){
try{ HttpPost httpPost= new HttpPost(address); HttpClient httpClient = new DefaultHttpClient();
UrlEncodedFormEntity postEntity;
postEntity = new UrlEncodedFormEntity(params,"utf-8");
httpPost.setEntity(postEntity);
HttpResponse httpResponse = httpClient.execute(httpPost);
if(httpResponse.getStatusLine().getStatusCode() == )
{
HttpEntity reEntity=httpResponse.getEntity();
String reposnse = EntityUtils.toString(reEntity,"utf-8");
if(listener != null)
{
listener.onFinish(reposnse);
}
} }catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
} }
String usertel = et_usertel.getText().toString().trim();
String password = et_password.getText().toString().trim(); String url_login = "http://192.168.1.102:8999/weixin/index.php/Home/Index/test";
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("usertel",usertel));
params.add(new BasicNameValuePair("password",password)); HttpUtil.sendRequestWithHttpClient(url_login,params,new HttpCallbackListener(){
@Override
public void onFinish(String response)
{
parseJSONWithJSONObject(response);
} @Override
public void onError(Exception e)
{
e.printStackTrace();
}
});
private void parseJSONWithJSONObject(String jsonData){
try{
JSONArray jsonArray= new JSONArray(jsonData);
Log.d("com.dlwz.playfootball","in parseJSONWithJSONObject"); for(int i=;i<jsonArray.length();i++)
{
JSONObject jsonObject = jsonArray.getJSONObject(i);
String name = jsonObject.getString("usertel");
String password = jsonObject.getString("password");
Log.d("com.dlwz.playfootball","name:"+name+",password:"+password);
dialog.dismiss();
startActivity(new Intent(LoginActivity.this,MainActivity.class)); }
} catch(Exception e){
e.printStackTrace();
}
}

AsyncHttpClient 测试代码[2]

RequestParams params = new RequestParams();
params.put("username", email);
params.put("password", password);
AsyncHttpClient client = new AsyncHttpClient();
client.get("http://192.168.1.102:8081/useraccount/login/dologin",params ,new AsyncHttpResponseHandler() {
// When the response returned by REST has Http response code '200'
@Override
public void onSuccess(String response) {
// Hide Progress Dialog
prgDialog.hide();
try {
// JSON Object
JSONObject obj = new JSONObject(response);
// When the JSON response has status boolean value assigned with true
if(obj.getBoolean("status")){
Toast.makeText(getApplicationContext(), "You are successfully logged in!", Toast.LENGTH_LONG).show();
// Navigate to Home screen
navigatetoHomeActivity();
}
// Else display error message
else{
errorMsg.setText(obj.getString("error_msg"));
Toast.makeText(getApplicationContext(), obj.getString("error_msg"), Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
// TODO Auto-generated catch block
Toast.makeText(getApplicationContext(), "Error Occured [Server's JSON response might be invalid]!", Toast.LENGTH_LONG).show();
e.printStackTrace(); }
}
// When the response returned by REST has Http response code other than '200'
@Override
public void onFailure(int statusCode, Throwable error,
String content) {
// Hide Progress Dialog
prgDialog.hide();
// When Http response code is '404'
if(statusCode == ){
Toast.makeText(getApplicationContext(), "Requested resource not found", Toast.LENGTH_LONG).show();
}
// When Http response code is '500'
else if(statusCode == ){
Toast.makeText(getApplicationContext(), "Something went wrong at server end", Toast.LENGTH_LONG).show();
}
// When Http response code other than 404, 500
else{
Toast.makeText(getApplicationContext(), "Unexpected Error occcured! [Most common Error: Device might not be connected to Internet or remote server is not up and running]", Toast.LENGTH_LONG).show();
}
}
});

Volley Post测试代码[3]

RequestQueue mQueue = Volley.newRequestQueue(this);
StringRequest stringRequest = new StringRequest(Request.Method.POST,"http://192.168.1.102:8999/weixin/index.php/Home/Index/test",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("TAG-onResponse", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG-onErrorResponse", error.getMessage(), error);
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> map = new HashMap<String, String>();
map.put("username", "mabo@qq.com");
map.put("password", "");
return map;
}
};
mQueue.add(stringRequest);

参考资料:

1、类 HttpUtil 代码参考自《第一行代码 Android》第10章5小节,只是将 HttpURLConnection 换成了 HttpClient。parseJSONWithJSONObject 参考自该书 400 页。该书作者郭霖,csdn博客:http://blog.csdn.net/guolin_blog/ 。

2、该代码参考自 http://programmerguru.com/android-tutorial/android-restful-webservice-tutorial-how-to-call-restful-webservice-in-android-part-3/?utm_source=tuicool 。该文共三部分,通过演示一个包含前端后端的例子介绍了 Restful Webservice 在 Android 开发中的应用。当时调试时 Android 端没什么问题,照着一步步来就没错,但服务器端用 Eclipse EE 创建动态web,在运行时报了错,经调试发现是在 Class.forName(Constants.dbClass) 处报了错,String dbClass = "com.mysql.jdbc.Driver" ,下载了个com.mysql.jdbc.Driver 导入才成功。

3、该代码参考自《第一行代码 Android》作者郭霖的博客:http://blog.csdn.net/guolin_blog/article/details/17482095 。测试该代码遇到了几个问题:首先就是由于防火墙的原因,volley 无法用 Git 直接 clone ,不得不设置代理才成功下载。第二个问题是 volley 的 jar 包生成,网上有不少方法,但在我这没成功。比如 stormzhang 的命令行,郭霖的通过 eclipse 导出 jar 包,可能是由于版本更新的原因,这些方法都没行,后来还是用 Android Studio 顺利编译生成 jar 包。终于可以在工程中顺利使用。第三个问题就是我自己犯的低级错误,web服务端直接用了上面AsyncHttpClient 的服务端程序,Android 端 Post 数据过去,但我没注意到服务器端只能处理 get 的 url ,因为之前用ThinkPhp 时是不用区分 get 和 post 的,处理方式一样。没想到 java 端反而要区分,耗费了不少时间才查出来。

Android开发-网络通信2的更多相关文章

  1. Android开发-网络通信1

    使用 org.apache.http.client.HttpClient; 一开始从官网下载HttpClient 4.5:http://hc.apache.org/downloads.cgi ,解压之 ...

  2. 学Android开发,入门语言java知识点

    学Android开发,入门语言java知识点 Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学 ...

  3. Android开发学习清单

    目录: 第1章 Android应用与开发环境1.1 Android的发展和历史1.1.1 Android的发展和简介1.1.2 Android平台架构及特性1.2 搭建Android开发环境1.2.1 ...

  4. Android开发学习——搭建开发环境

    在学校开课学习了android的一些简单的UI组件,布局,四大组件学习了2个,数据存储及网络通信,都是一些简单的概念,入门而已.许多东西需要自己去学习. 学习一下 Android开发环境的搭建,两种方 ...

  5. 【Android开发资料分享】自己整理的Android开发资料,非常全面

    学习Android以来,不知不觉中收集了大量非常优秀的Android开发资料,一直没有系统的整理,最近抽时间把收藏夹中的资料做了一下整理,现在分享给大家,希望能够帮助到需要的人.这份资料我还会不断的更 ...

  6. [转]【eoeAndroid索引】史上最牛最全android开发知识汇总

    一.开发环境搭建 (已完成) 负责人:kris 状态:已完成 所整理标签为:搭建 SDK JDK NDK Eclipse ADT 模拟器 AVD 调试器(DEBUG) DDMS 测试 日志 Logca ...

  7. Android开发系列之学习路线图

    通过前面的3篇博客已经简单的介绍了Android开发的过程并写了一个简单的demo,了解了Android开发的环境以及一些背景知识. 接下来这篇博客不打算继续学习Android开发的细节,先停一下,明 ...

  8. 《Android开发艺术探索》读书笔记 (2) 第2章 IPC机制

    2.1 Android IPC简介 (1)任何一个操作系统都需要有相应的IPC机制,Linux上可以通过命名通道.共享内存.信号量等来进行进程间通信.Android系统不仅可以使用了Binder机制来 ...

  9. Android 开发技术流程

    1.网络连接通信 HttpClient 类通信(见<第一行代码> 郭霖2014.8月第一版P385) Android Asynchronous Http Client  (见  http: ...

随机推荐

  1. 棋盘格 测量 相机近似精度 (像素精度&物理精度)

    像素精度计算 像素精度——一像素对应多少毫米——距离不同像素精度也不同 将棋盘格与相机CCD平面大致平行摆放,通过[每个点处的近似像素精度=相邻两个角点之间的实际距离(棋盘格尺寸已知)/ 棋盘格上检出 ...

  2. Hbase架构和读写流程

    转载自:http://www.cnblogs.com/muzili-ykt/p/muzili_ykt.html 在HBase读写时,相同Cell(RowKey/ColumnFamily/Column相 ...

  3. MySQL整理(一)

    一.数据管理发展阶段 人工管理阶段→文件系统阶段→数据库系统阶段    二.数据库管理系统提供的功能   (1)数据定义语言DDL:提供数据定义语言定义数据库及各种对象,定义数据的完整性约束和保密限制 ...

  4. WooCommerce Shortcode 简码使用方式说明

    WooCommerce 自帶的几个简易代码,可以用来插入文章和页面內容里面.下面简码安裝时会自动建立,因此,应该不需要使用在其他地方 : [woocommerce_cart] – 顯示購物車頁面 [w ...

  5. EntityFramework 6 开篇

    本系列文章主要来讲解理解以及怎样使用EntityFramework,写这个系列主要是因为部门里面准备来使用EF,为了让大家一起来学习,我每天发布1-2篇文章让大家一块参与学习.之前一直写在有道云笔记里 ...

  6. 开源BBS论坛软件推荐

    七款开源BBS论坛软件推荐(1) 本文介绍了七个开源的BBS论坛软件(在英文界一般叫做Forum).可能国内的朋友们比较熟悉Discuz!和PHPwind,但其实我们的选择还是很多的,而且下面介绍的这 ...

  7. session、cookie、token

    各自应用场景考虑session.token.cookie是不是有各自的应用场景,比如传统项目适合用session和cookie单页应用适合用token分布式适合用token等等 token如果非要选择 ...

  8. 『NiFi 学习之路』自定义 —— 组件的自定义及使用

    一.概述 许多业务仅仅使用官方提供的组件不能够满足性能上的需求,往往要通过高度可定制的组件来完成特定的业务需求. 而 NiFi 提供了自定义组件的这种方式. 二.自定义 Processor 占坑待续 ...

  9. 2018秦皇岛ccpc-camp Steins;Gate (原根+FFT)

    因为给定的模数P保证是素数,所以P一定有原根. 根据原根的性质,若\(g\)是\(P\)的原根,则\(g^k\)能够生成\([1,P-1]\)中所有的数,这样的k一共有P-2个. 则\(a_i*a_j ...

  10. 关于ldap的学习

    主要从以下网站学习了相关基础知识概念,安装与基本配置. http://www.aikaiyuan.com/8269.htmlhttps://segmentfault.com/a/11900000026 ...