Volley简介:
我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高。Volley的一个很大的特色,就是所有的网络请求无需开发者自己执行,而是在请求构造完成后扔到Volley的请求队列中,队列依次进行请求,这样就省去了很多麻烦,开发者也不用担心网络请求是否会冲突,是否会在主线程,这些烦心事Volley的网络队列都帮我们解决了。
不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码。于是乎,一些Android网络通信框架也就应运而生,比如说AsyncHttpClient,它把HTTP所有的通信细节全部封装在了内部,我们只需要简单调用几行代码就可以完成通信操作了。再比如Universal-Image-Loader,它使得在界面上显示网络图片的操作变得极度简单,开发者不用关心如何从网络上获取图片,也不用关心开启线程、回收图片资源等细节,Universal-Image-Loader已经把一切都做好了。
Android开发团队也是意识到了有必要将HTTP的通信操作再进行简单化,于是在2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。
下载及应用Volley.jar:
第一步:到网上搜索Volley.jar,下载即可
第二步:
这样就完成了jar包的配置
使用Volley:
1.创建请求队列RequestQueue:RequestQueue mQueue = Volley.newRequestQueue(context);
2.创建请求:StringRequest stringRequest = new StringRequest("http://www.baidu.com",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("TAG", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
});
3.将第二步中的请求加入第一步中的请求队列:mQueue.add(stringRequest);
这三步就完成了网络请求,真的挺简单的!
上面的这种方法只是用于get请求,还有一种创建post请求,如下:
StringRequest stringRequest = new StringRequest(Method.POST, url, listener, errorListener);
具体实现:StringRequest request = new StringRequest(
Request.Method.POST,
"http://foo.cloudant.com/_session",
new Response.Listener<String>() {
@Override
public void onResponse(String s) {
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
}
) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError { //设置头信息
Map<String, String> map = new HashMap<String, String>();
map.put("Content-Type", "application/x-www-form-urldecoded");
return map;
}
@Override
protected Map<String, String> getParams() throws AuthFailureError { //设置参数
Map<String, String> map = new HashMap<String, String>();
map.put("name", "foo");
map.put("password", "bar");
return map;
}
};
小demo:
代码如下:
package com.example.yzg.highui;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
public class VolleyActivity extends AppCompatActivity {
Button mgetrequest;
public static RequestQueue requestQueue;
StringRequest stringRequest;
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_volley);
mgetrequest = findViewById(R.id.getrequest);
textView = findViewById(R.id.text_response);
mgetrequest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
doRequest();
}
});
}
private void doRequest() {
requestQueue = Volley.newRequestQueue(VolleyActivity.this);
stringRequest = new StringRequest("https://www.baidu.com", new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("测试", "onResponse: " + response);
textView.setText(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.d("测试", "onErrorResponse: " + error);
}
});
requestQueue.add(stringRequest);
}
}
基本上这两种用法就足够请求文本文件的信息了,剩下的还有一个照片请求,在接下来的一篇博客中做笔记。