首先先說明一下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;
}
}
}