Android开发-网络通信2

调试了三种通信方法: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() == 200)
                    {
                        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=0;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 == 404){
         Toast.makeText(getApplicationContext(), "Requested resource not found", Toast.LENGTH_LONG).show();
     }
     // When Http response code is ‘500‘
     else if(statusCode == 500){
         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", "[email protected]");
        map.put("password", "123456");
        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 端反而要区分,耗费了不少时间才查出来。

时间: 2024-10-02 20:17:01

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

C#程序员学习Android开发系列之学习路线图

通过前面的3篇博客已经简单的介绍了Android开发的过程并写了一个简单的demo,了解了Android开发的环境以及一些背景知识. 接下来这篇博客不打算继续学习Android开发的细节,先停一下,明确一下接下来的学习目标以及学习路线. 一.对Android开发的基本认识 1.Android原生开发是基于Java语言的,由于我比较擅长C#,所以对Java语言本身不太熟练,需要加强Java语言基础的练习,这一块我会穿插到具体的知识点练习当中,并且在必要的地方给出与C#语言的对比(其实基本上在语法层

Android开发系列之学习路线图

通过前面的3篇博客已经简单的介绍了Android开发的过程并写了一个简单的demo,了解了Android开发的环境以及一些背景知识. 接下来这篇博客不打算继续学习Android开发的细节,先停一下,明白一下接下来的学习目标以及学习路线. 一.对Android开发的基本认识 1.Android原生开发是基于Java语言的.因为我比較擅长C#,所以对Java语言本身不太熟练,须要加强Java语言基础的练习,这一块我会穿插到详细的知识点练习其中.而且在必要的地方给出与C#语言的对照(事实上基本上在语法

Android开发常用流行开源框架记录

发掘了一些Android常用开源框架,记录并分享,希望能在开发当中帮到大家. 缓存: 名称:DiskLruCache 描述:Java实现基于LRU的硬盘缓存 源码地址(可能需要翻墙) 作者:guolin 相关博客:Android DiskLruCache完全解析,硬盘缓存的最佳方案 图片加载: Android-Universal-Image-Loader 描述:一个开源的UI组件程序,该项目的目的是提供一个可重复使用的仪器为异步图像加载,缓存和显示.所以,如果你的程序里需要这个功能的话,那么不妨

【转】android开发中关于模拟器emulation的常见问题

[转]android开发中关于模拟器emulation的常见问题 Trouble: 无法启动android模拟器,提示 XDM authorization key matches an existing client! SDL init failure, reason is: No available video device Oneway: 打开电脑的 Terminal 终端, 以当前图形界面用户的身份执行命令 xhost localhost 即可,如果想实现登录后自动执行这个命令,可以做以下

一个星期自学入门android开发,是否可能?

目前的工作就是每天做项目管理,做初级前端开发.对了,一大部分是要给甲方各种修改,烦恼.. 所幸这几天手头项目闲了下了,先挑个感兴趣的东西充充电,一直都对app开发有点兴趣,这个星期来入门一下,做个自己的小APP如何,需要的功能嘛,嘿嘿 我已经想好了. 需要GPS定位,放入android后台执行,可设置每个多少时间向服务器传递所在位置.或是由服务器申请获取GPS位置,传输给另一个APP客户端,调用百度map显示.试试看. http://www.jikexueyuan.com/path/androi

Android开发笔记(一百一十一)聊天室中的Socket通信

Socket通信 基本概念 对于程序开发来说,网络通信的基础就是Socket,但因为是基础,所以用起来不容易,今天我们就来谈谈Socket通信.计算机网络有个大名鼎鼎的TCP/IP协议,普通用户在电脑上设置本地连接的ip时,便经常看到下图的弹窗,注意红框部分已经很好地描述了TCP/IP协议的作用. TCP/IP是个协议组,它分为三个层次:网络层.传输层和应用层: 网络层包括:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 传输层包括:TCP协议.UDP协议. 应用层包括:HT

Android开发技术周报 Issue#15

教程 Android Studio系列教程五--Gradle命令详解与导入第三方包 Android Studio + Gradle的组合用起来非常方便,很多第三方开源项目也早都迁移到了Studio,为此今天就来介绍下查看.编译并导入第三方开源项目的方法. 打造极致Material Design动画风格Button 在我的文章中曾经有两篇关于Material Design风格的按钮实现.在第一章中只是简单的实现了动画的波纹效果,而在第二篇中对此进行了一定的扩充与优化,最后实现可以自动移动到中心位置

Android 开发从入门到精通

如今的安卓开发越来越火,很多人投身到安卓的开发之中. 1. 疯狂Android讲义(第2版) 第一版荣获"电子工业出版社最畅销图书奖":累计印刷10次,销售码洋二百余万,是Android学习.开发人员必备之选. 本书深入阐述了Android应用开发的Activity.Service.BroadcastReceiver与ContentProvider四大组件,并详细介绍了Android全部图形界面组件的功能和用法,Android各种资源的管理与用法,Android图形.图像处理,事件处理

Android开发实现HttpClient工具类

在Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们使用各种Http服务.你可以把HttpClient想象成一个浏览器,通过它的API我们可以很方便的发出GET,POST请求(当然它的功能远不止这些). 比如你只需以下几行代码就能发出一个简单的GET请求并打印响应结果: try {         // 创建一个默认的HttpClient         HttpClient httpclient =