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();
}
}