Volley框架的使用

首先先说明一下Volley框架使用的优点:

     通信更快,更简单(数据量不大,但网络通信频繁)

      Get、Post网络请求及网络图像的高效率异步处理

      排序(可以通过网络请求的优先级进行处理)

      网络请求的缓存

     网络图片加载和缓存

     加载图片与监听    ImageRequest:加载网络图片

                                  ImageLoader:缓存,加载图片

                                 NetworkImageView:辅助加载图片

 首先我们需要知道Volley自带了三种返回类型:

     StringRequest:主要使用在对请求数据的返回类型不确定的情况下,StringRequest涵盖了JsonObjectRequest和JsonArrayRequest。

     JsonObjectRequest:当确定请求数据的返回类型为JsonObject时使用。

     JsonArrayRequest:当确定请求数据的返回类型为JsonArray时使用。

首先我把Volley功能分为了三块,第一块为get网络请求,第二为post网络请求,第三为关于图片的加载

库依赖:implementation 'com.github.bumptech.glide:volley-integration:4.9.0'(网上随便找的一个);

1.get网络请求(效果图)

                                                                             

代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
Button btn1;
private RequestQueue requestQueue;
String url = "https://wanandroid.com/article/listproject/0/json";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}

private void initView() {//初始化数据
btn1 = findViewById(R.id.btn1);
requestQueue = Volley.newRequestQueue(getBaseContext());//消息队列的初始化
btn1.setOnClickListener(this);//点击事件
}


public JsonObjectRequest stringRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {//get
@Override
public void onResponse(JSONObject response) {
Toast.makeText(MainActivity.this, response.toString(), Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_SHORT).show();
}
});

@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn1:
requestQueue.add(stringRequest);
requestQueue.start();
stringRequest.setTag("abcGet");
break;
}
}
}

2.post网络请求(效果图)      

 代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
Button btn2;
private RequestQueue requestQueue;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}

private void initView() {//初始化数据
btn2 = findViewById(R.id.btn2);
requestQueue = Volley.newRequestQueue(getBaseContext());
btn2.setOnClickListener(this);
}


@Override
public void onClick(View v) {
case R.id.btn2:
volleyPost();
requestQueue.start();
break;

}
}

private void volleyPost() {
String link = "https://www.wanandroid.com/user/login";
// Map<String,String> map = new HashMap<>();//post发送的参数
// map.put("username","woziji");
// map.put("password","123456789");
// map.put("repassword","123456789");
//将map转化为JSONObject对象
// JSONObject jsonObject = new JSONObject(map);
//上面这些是使用JSONObject时需把post参数进行添加
StringRequest request = new StringRequest(Request.Method.POST, link, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Toast.makeText(MainActivity.this,response,Toast.LENGTH_SHORT).show();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this,error.toString(),Toast.LENGTH_SHORT).show();
}
}){//post请求一定要重写getParams();
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> map = new HashMap<>();//post发送的参数
map.put("username","xueyuhang");
map.put("password","123456789");
return map;
}
};
//设置请求的Tag标签,可以在全局请求队列中通过Tag标签进行请求的查找
request.setTag("testPost");
//将请求加入全局队列中
requestQueue.add(request);
}
}

 3.加载图片  

效果图:

ImageRequest加载方式:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button btn1, btn2, btn3;
ImageView imageView;
private RequestQueue requestQueue;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}

private void initView() {//初始化数据
btn3 = findViewById(R.id.btn3);
imageView = findViewById(R.id.img);
requestQueue = Volley.newRequestQueue(getBaseContext());
btn3.setOnClickListener(this);
}


@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn3:
imageload();
break;

}
}

private void imageload() {
String urls = "https://www.wanandroid.com/blogimgs/62c1bd68-b5f3-4a3c-a649-7ca8c7dfabe6.png";
ImageRequest imageRequest = new ImageRequest(urls, new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
imageView.setImageBitmap(bitmap);
}
}, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {//maxWidth/maxHeight传0时为原图宽高
@Override
public void onErrorResponse(VolleyError error) {
imageView.setBackgroundColor(Color.BLUE);
}
});
requestQueue.add(imageRequest);

}


}
ImageLoader的缓存加载方式:需要设置加载图片的过程中显示的图片以及加载失败显示的图片
步骤1:新建一个缓存类实现ImageCache接口(设置缓存图片的大小)当前为10M
代码:
public class BitmapCatch implements ImageLoader.ImageCache {//缓存类
public LruCache<String,Bitmap> cache;
public int max = 10*1024*1024;//10M

public BitmapCatch(){
cache = new LruCache<String,Bitmap>(max){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String s) {
return cache.get(s);
}

@Override
public void putBitmap(String s, Bitmap bitmap) {
cache.put(s,bitmap);
}
}
活动中的代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button btn3;
ImageView imageView;
RequestQueue mQueue;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}

private void initView() {//初始化数据
btn3 = findViewById(R.id.btn3);
imageView = findViewById(R.id.img);
// requestQueue = Volley.newRequestQueue(getBaseContext());
mQueue = Volley.newRequestQueue(this);
btn3.setOnClickListener(this);
}


@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn3:
ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCatch());//调用缓存类
ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView,R.drawable.ic_launcher_background,R.drawable.ic_launcher_foreground);//三个参数,要显示的控件,加载过程中显示的图片,加载失败显示的图片
imageLoader.get("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",listener);
break;
}
}
}
NetWorkImageView使用方法:类似ImageLoader 他继承ImageView 操作更加简便,易懂
public class BitmapCatch implements ImageLoader.ImageCache {//缓存类
public LruCache<String,Bitmap> cache;
public int max = 10*1024*1024;//10M

public BitmapCatch(){
cache = new LruCache<String,Bitmap>(max){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String s) {
return cache.get(s);
}

@Override
public void putBitmap(String s, Bitmap bitmap) {
cache.put(s,bitmap);
}
}
在xml中添加NetWorkImageView控件
活动中的代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button btn1, btn2, btn3;

NetworkImageView networkImageView;
RequestQueue mQueue;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}

private void initView() {//初始化数据
btn3 = findViewById(R.id.btn3);

networkImageView = findViewById(R.id.network);
// requestQueue = Volley.newRequestQueue(getBaseContext());
mQueue = Volley.newRequestQueue(this);
btn3.setOnClickListener(this);
}


@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn3:
networkImageView.setDefaultImageResId(R.drawable.ic_launcher_background);//加载中显示
networkImageView.setErrorImageResId(R.drawable.ic_launcher_foreground);//记载失败显示
ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCatch());//或者不写缓存类,直接new ImageLoader(){}重写他的两个方法也可以,不过效果肯定没有缓存类的要理想

networkImageView.setImageUrl("https://img-my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",imageLoader);
                break;
}
}
}



原文地址:https://www.cnblogs.com/yh0409/p/10783590.html