Android就业面试技巧系列-技术篇8 (Volley框架)

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]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
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]  纯文本查看  复制代码
?
1
2
3
4
5
   //获取应用上下文
    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]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
   //创建一个请求
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]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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]  纯文本查看  复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值