zoukankan      html  css  js  c++  java
  • 简单说说NoHTTP

      学习NoHttp的原因是由于公司之前做的产品使用的网络请求框架一直都是Volley(为什么使用Volley就不用多说了,最起码是谷歌开发团队自己搞的,总感觉权威一些),可是自从android6.0推出以后,Volley的使用开始有点动摇了。因为android6.0删除了HttpClient相关的API,我们知道的一般网络请求使用的API是HttpClient和URLConnection,而Volley就是基于HttpClient,虽然android2.3后2.3Volley可以解析URLConnection,但是部分解析URLConnection请求和响应还是用HttpClient的API。Google在android6.0删除HttpClient的缘由我们不去赘述,但是为此带来的问题就是可能在之后的版本中,volley的使用会存在一些问题,所以这个时候,公司觉得逐步用NoHttp(他是支持URLConnection的)取代Volley。

      那么问题来了,volley和nohttp的异同有那些呢??下面我是从http://blog.csdn.net/yanzhenjie1003截的图,对比比较全面:

      对比的东西就是上面那些,这里就不在一一分析了,接下来说的就是,如何使用nohttp:

      1、导包,这里就不在多说了,在androidstudio里面可以直接导入的。

      2、网络接口

        public static String URL = "http://192.168.1.210:8080/Today/";
        public static String SELECTMYCONTENT_URL=URL+"mycontent_select.php";
     /**
         * 查找我的内容
         * @param mContext
         * @param begin
         * @param length
         * @param key
         * @param onResponseListener
         */
        public static void getSelectMyContentResult(Context mContext,String begin,String length,int key,
                                                    OnResponseListener onResponseListener){
            Request<JSONObject> request=NoHttp.createJsonObjectRequest(SELECTMYCONTENT_URL,RequestMethod.POST);
            request.add("user_id",UserInfo.getUserId(mContext));
            request.add("begin",begin);
            request.add("length",length);
            request.addHeader("Author", "nohttp_sample");
            ServerApi.requestQueue.add(key, request, onResponseListener);
        }
    

      上面是我写的一个有关数据库查询的接口,里面的URL自定义,从服务器返回的数据是json格式的,向队列里添加的Request的参数是JSONObject。

      下面就接口的调用,其实很简单,由于这个网络接口写在ServerApi中,且接口是静态方法,所以调用的时候直接使用“类名.方法”就可以直接调用了。

    ServerApi.getSelectMyContentResult(MyContentActivity.this, String.valueOf(begin),
                    String.valueOf(length), NOHTTP_WHAT_TEST,
                    onResponseListener);
    

      调用的时候传入相应的参数即可。

      接下就是写个OnResponseListener,其实这是一个数据回调对象,用于接收网络请求返回结果:

    private OnResponseListener<JSONObject> onResponseListenerAppData = new OnResponseListener<JSONObject>() {
            @SuppressWarnings("unused")
            @Override
            public void onSucceed(int what, Response<JSONObject> response) {
                if (what == NOHTTP_WHAT_TEST) {// 判断what是否是刚才指定的请求
                    // 请求成功
                    String result = response.get().toString();// 响应结果
                    Log.d("TAGTAG",result);
                    // 响应头
                    Headers headers = response.getHeaders();
                    headers.getResponseCode();// 响应码
                    response.getNetworkMillis();// 请求花费的时间
                }
            }
    
            @Override
            public void onFailed(int i, String s, Object o, Exception e, int i1, long l) {
                Toast.makeText(MyContentActivity.this, "登录失败请重试", Toast.LENGTH_SHORT).show();
            }
    
            @Override
            public void onStart(int what) {
                // 请求开始,显示dialog
            }
    
            @Override
            public void onFinish(int what) {
                // 请求结束,关闭dialog
            }
        };
    

      如上,在对调对象中,明确的声明了网络请求开始、结束、成功、失败相对应的方法,相应的操作写在方法中即可。

      同时在上面的代码中有个常量:NOHTTP_WHAT_TEST。这个是自己定义的,用来标志请求的what, 类似handler的what一样,这里用来区分请求,这个自己定义。

      上面就是个很简单的使用nohttp实现网络请求的例子,至于其他的应用,会在后续的博客中更新。


    不是闷骚的程序员算不上程序员。我的微信公众号“那点鼻事”,在这里周一到周五每天一篇文章,与技术无关,只哈牛逼。

  • 相关阅读:
    PLC 控制系统资源
    .net core 控制台程序生成EXE
    EF Core 日志跟踪sql语句
    Oracle 设置自启动
    数据库批量插入数据
    字符串面试题系列之六:在字符串中删除特定的字符
    字符串面试题系列之五:删除字符串空格
    字符串面试题系列之四:字符串匹配二
    字符串面试题系列之三:左旋转字符串
    字符串面试题系列之二:连续最长数字串
  • 原文地址:https://www.cnblogs.com/YaoJianXun/p/5696194.html
Copyright © 2011-2022 走看看