A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小鲁哥哥 于 2017-4-8 20:46 编辑

【济南中心】Android就业面试技巧系列-技术篇(Volley框架)

Volley简介:
比较流行的http开发库。也封装这个线程。
1.使用底层代码来写http请求 代码量比较大。httpclient j2se httpURLConnection AscynHttpClient
2.高频率http请求    优势在处理数据量比较小的频率高的请求。
3.劣势 大文件的请求。大文件的上传和下载。

环境搭建:
1.创建一个工程
2.配置权限 Inernet
    <!--联网权限-->
    <uses-permission android:name="android.permission.INTERNET" />
3.添加jar同时绑定源代码
    dependencies {
    compile 'com.mcxiaoke.volley:library:1.0.19'

RequestQueue:
RequestQueue是一个请求队列对象,它可以缓存所有的HTTP请求,然后按照一定的算法并发地发出这些请求。RequestQueue内部的设计就是非常合适高并发的,因此我们不必为每一次HTTP请求都创建一个RequestQueue对象,这是非常浪费资源的,基本上在每一个需要和网络交互的Activity中创建一个RequestQueue对象就足够了。建议在Application子类中创建。

一.创建在Application http.itheima.com.http_volley.VolleyApplication
[Java] 纯文本查看 复制代码
    public class VolleyApplication extends Application{
    
        //只要有一个组件启动就可执行onCreate
        private RequestQueue requestQueue;
        //提供get获取方法
        public  RequestQueue getInstance()
        {
            return requestQueue;
        }
        @Override
        public void onCreate() {
            super.onCreate();
            //创建一个核心类
             requestQueue = Volley.newRequestQueue(this);//参1.Context上下文
        }
    }

二.在功能清单里面配置 src/main/AndroidManifest.xml
   <application
        android:name="http.itheima.com.http_volley.VolleyApplication"

三 .提供get该法给其它的页面使用。 http.itheima.com.http_volley.MainActivity
[Java] 纯文本查看 复制代码
          //获取应用上下文
           VolleyApplication application= (VolleyApplication) this.getApplication();
        //返回请求队表
        RequestQueue queue=application.getInstance();
        Log.i("MainActivity",queue+"");

案例1:
Request.Method volley的请求方式 常用的有get post
Response.Listener  volley通过注册监听器获取服务端返回的数据  (成功时候返回的数据)
Response.ErrorListener  网络可能出现异常。volley也通过监听器处理网络异常(失败时候返回的数据)
StringRequest  volley提供的http请求对象的封装。如果你要发送一个请求只需要创建Request的实现类的实例。
[Java] 纯文本查看 复制代码
          //创建一个请求
        String url="http://192.168.1.114:8080/webapi//get?username=itheima";

        //根据返回结果创建请求类型
        int method= Request.Method.GET;//参1.请求方法  参数2.网络连接的地址 参3.获取数据成功的处理监听器

        Response.Listener listener= new Response.Listener<String>() {
            //
            @Override
            public void onResponse(String response) {
                //业务:展示给用户
                tvResponseString.setText(response);
            }
        };
        //参4.网络处理失败监听器
        Response.ErrorListener errorListener = new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                //业务:展示组用户网络出错的视图
                tvResponseString.setText(">--< 网络出错了"+error.getMessage());
            }
        };
        //返回类型为String请求
        //Request:代表一个网络请求
        //  |--StringRequest 结果是一个String
        //  |--JsonReqeust 结果就是一个json 字符串
        //  |--JsonArrayRequest 结果是一个json数据组对象
        //  |--JSONObject  结果就是一个json对象
        //  |--ImageRequest 结果是一张图片
        StringRequest  request=new StringRequest(method,url,listener,errorListener);
        //只需添加请求队列里面由队列自行处理
        queue.add(request);
案例二:
项目中一般使用它来完成登录 。注册等等。
volley封装代码非常简洁。get post的底层差别是 对请求参数是否进行表单编码。但是在代码上的差异只有两处:
1.参1使用  int method = Request.Method.POST;
2.重写StringRequest的getParams返回表单数据 给底层。
3.不需要处理中文乱码。
[Java] 纯文本查看 复制代码
final TextView tvResponseString = (TextView) findViewById(R.id.activity_main_tv_reponse_string);
        //获取应用上下文
        VolleyApplication application = (VolleyApplication) this.getApplication();
        //返回请求列表
        RequestQueue queue = application.getInstance();
        Log.i("MainActivity", queue + "");
        String url = "http://192.168.1.114:8080/webapi/post";
        //Volley把表单参数存在map
      final   HashMap<String, String> params = new HashMap<>();
        // username=hh&password=123
        params.put("username", "hh中国");
        params.put("password", "123");
        //创建String返回类型的请求
        //参1.
        int method = Request.Method.POST;
        //参2.地址

        //参3.
        Response.Listener<String> listener = new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {

                //业务 展示
                //{"msg":"成功收到信息","data":"45cefcea-4090-4690-bea4-7351f72cd50d"}
                try {
                    JSONObject jsonObject = new JSONObject(response);
                    String msg = jsonObject.getString("msg");
                    String data = jsonObject.getString("data");
                    tvResponseString.setText(msg + " " + data);
                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }
        };

        //参4
        Response.ErrorListener errorListener = new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                tvResponseString.setText("获取数据失败");
            }
        };
        StringRequest request = new StringRequest(method, url,listener,errorListener){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {// 重写getParams() 方法  把参数放到请求里面  
                return params;//getParams发送请求时把数据取出放入请求里
            }
        };
        //发送
        queue.add(request);
案例三.请求类型
volley为了满足项目中的常见数据返回类型提供了Request的几个子类
              //Request:代表一个网络请求
            //  |--StringRequest 结果是一个String
            //  |--JsonReqeust 结果就是一个json 字符串
            //  |--JsonArrayRequest 结果是一个json数据组对象
            //  |--JSONObject  结果就是一个json对象
            //  |--ImageRequest 结果是一张图片 图片框架课
根据服务端返回的数据类型不同来创建上面的几种请求方式  本例中以服务端返回的是String字符串,以创建的是StringRequest 请求
一般请求类型不同Response.Listener传入参数也不同。
实现代码:
[Java] 纯文本查看 复制代码
 final TextView tvResponseString= (TextView) findViewById(R.id.activity_main_tv_reponse_string);
        //获取应用上下文
       VolleyApplication application= (VolleyApplication) this.getApplication();
        //返回请求列表
        RequestQueue queue=application.getInstance();
        Log.i("MainActivity",queue+"");

        //创建一个请求
        String url="http://192.168.1.114:8080/webapi//get?username=itheima";

        //根据返回结果创建请求类型
        int method= Request.Method.GET;//参1.请求方法  参数2.网络连接的地址 参3.获取数据成功的处理监听器

        Response.Listener<JSONObject> listener= new Response.Listener<JSONObject>() {
            //
            @Override
            public void onResponse(JSONObject response) {
                //服务端返回的数据
                //{"msg":"成功收到信息","data":{"username":"\"黑马\""}}
                try {
                   String msg= response.getString("msg");
                  String username=  response.getJSONObject("data").getString("username");
                    //业务:展示给用户
                    tvResponseString.setText(msg+" "+username);
                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }
        };
        //参4.网络处理失败监听器
        Response.ErrorListener errorListener = new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                //业务:展示组用户网络出错的视图
                tvResponseString.setText(">--< 网络出错了"+error.getMessage());
            }
        };
        //返回类型为String请求
        //Request:代表一个网络请求
        //  |--StringRequest 结果是一个String
        //  |--JsonReqeust 结果就是一个json 字符串
        //  |--JsonArrayRequest 结果是一个json数据组对象
        //  |--JSONObject  结果就是一个json对象
        //  |--ImageRequest 结果是一张图片 图片框架课
       // StringRequest  request=new StringRequest(method,url,listener,errorListener);

        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(method, url, listener, errorListener);
        //只需添加请求队列里面由队列自行处理    把请求放到子线程中处理
        queue.add(jsonObjectRequest);



【济南中心】就业面试技巧系列(持续更新中...)
(出处: 黑马程序员IT技术论坛)

【济南校区】Android/php/JavaEE课程笔记同步+面试技巧同步更新
(出处: 黑马程序员IT技术论坛)


1 个回复

正序浏览
多谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马