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




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM