Volley详解与封装

 

Volley适合进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。

Volley简介

volley 是 Goole I/O 2013上发布的网络通信库,使网络通信更快、更简单、更健壮。
关键词:数据不大但通信频繁
Volley名称的由来: a burst or emission of many things or a large amount at once

Volley提供的功能

  • Json,图像等异步下载
  • 网络请求的排序(scheduling)
  • 网络请求的优先级处理
  • 缓存
  • 多级别取消请求
  • 和 Activity 的生命周期联动(Activity 结束时同时取消所有网络请求)

Volley 的优点

  • 非常适合进行数据量不大,但通信频繁的网络操作
  • 可直接在主线程调用服务端并处理返回结果
  • 可以取消请求,容易扩展,面向接口编程
  • 网络请求线程NetworkDispatcher默认开启了4个,可以优化,通过手机CPU数量
  • 通过使用标准的HTTP缓存机制保持磁盘和内存响应的一致

Volley 的缺点

  • 使用的是httpclient、HttpURLConnection
  • 6.0不支持httpclient了,如果想支持得添加org.apache.http.legacy.jar
  • 对大文件下载 Volley的表现非常糟糕
  • 只支持http请求
  • 图片加载性能一般

配置依赖/引入jar包

 implementation files('libs/volley.jar')

或者  

compile 'com.mcxiaoke.volley:library:1.0.19'

Volley 的使用

由于Volley是要访问网络的,因此不要忘记在你的AndroidManifest.xml中添加如下权限:

<uses-permission android:name="android.permission.INTERNET" />

创建Volley工具类和回调接口

1.回调接口

public interface HttpImpl {
    void showError(String error);
    void showResponse(String response);
}

2.工具类,并set 回调接口

public class HttpUtils {
    private static final String TAG = "HttpUtils";
    /**
     * 声明RequestQueue对象
     */
    static RequestQueue mQueue = null;

    /**
     * 声明StringRequest对象
     */
    static StringRequest stringRequest = null;

    static JsonObjectRequest mJsonObjectRequest = null;

    /**
     * 声明HttpImpl回调对象
     */
    private static HttpImpl mHttpImpl;

    /**
     * 设置HttpImpl回调
     */    
    public static void setHttpImpl(HttpImpl httpImpl){
        mHttpImpl = httpImpl;
    }

    /**
     * 1、获取RequestQueue对象
     */
    public static RequestQueue getRequestQueue(Context context) {
        if (mQueue == null) {
            mQueue = Volley.newRequestQueue(context);
        }
        return mQueue;
    }

    /**
     * 2.获取StringRequest对象
     *
     * @param url 请求的url
     * @return StringRequest
     */
    public static StringRequest getStringRequest(String url) {
        return stringRequest = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        //调用showResponse
                        mHttpImpl.showResponse(response);
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                //调用showError
                mHttpImpl.showError(error.getMessage());
            }
        });
    }

    /**
     * 获取JsonObjectRequest对象
     *
     * @param url 请求url
     * @return JsonObjectRequest
     */
    public static JsonObjectRequest getJsonObjectRequest(String url) {
        return mJsonObjectRequest = new JsonObjectRequest(url, null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        //调用showResponse
                        mHttpImpl.showResponse(response.toString());
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                //调用showError  
                mHttpImpl.showError(volleyError.getMessage());
            }
        });
    }
}

3.调用工具类,并实现HttpImpl回调接口

public class MainActivity extends AppCompatActivity implements HttpImpl{
    private Context mContext;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = this;
        HttpUtils.setHttpImpl(this);
        HttpUtils.getRequestQueue(this).add(HttpUtils.getStringRequest("https://www.baidu.com"));
    }

    @Override
    public void showError(String error) {
        Log.i("lzq","showError");
        Toast.makeText(mContext,error,Toast.LENGTH_LONG).show();
    }

    @Override
    public void showResponse(String response) {
        Log.i("lzq","showResponse:"+response);
        Toast.makeText(mContext,"OKOKOK",Toast.LENGTH_LONG).show();
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值