volley的框架的优势:
- 自动网络请求调度
- 多个并发网络连接
- 支持请求优先级
- 取消请求API。您可以取消单个请求,也可以设置取消的时间段或范围。
- 可轻松自定义,例如自定义重试和退避的时间
- 强大的排序功能,让你可以轻松使用网络异步获取数据填充界面
- 调试和跟踪工具
volley的使用详细教程
AndroidManifest.xml文件里面配置
// 网络权限标配
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:usesCleartextTraffic="true"
......
/* android:usesCleartextTraffic="true"
这一行不配置会报错,原因是,从Android P系统开始不允许明码访问了,默认都是加密连接,需要使用传输层安全协议。否则:
java.io.IOException: Cleartext HTTP traffic to **** not permitted*/
在 build.gradle里面配置volley和Gson的库
implementation 'com.android.volley:volley:1.1.1'
implementation 'com.google.code.gson:gson:2.8.6'
实现的代码MainActivity和BitmapCache
package com.example.customizeview;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.NetworkImageView;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.example.customizeview.Thread.TestCallable;
import com.example.customizeview.network_request.BitmapCache;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import org.json.JSONObject;
public class MainActivity extends AppCompatActivity {
private ListView listView_two;
private ListView listView_one;
private static final String TAG = "Volley";
private ImageView iv_image;
private NetworkImageView nv_image;
private Button button;
private RequestQueue queue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*setContentView(R.layout.activity_customize_viewgroup);
listView_one = findViewById(R.id.lv_one);
listView_two = findViewById(R.id.lv_two);
String[] strs_one = {"1","2","3","4","5","6","1","1","1","1","1","1","1","1"};
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,strs_one);
listView_one.setAdapter(adapter);
String[] strs_two = {"A","B","C","D","E","F","G","H","A","A","A"};
ArrayAdapter arrayAdapter = new ArrayAdapter(this,android.R.layout.simple_expandable_list_item_1,strs_two);
listView_two.setAdapter(arrayAdapter);
TestCallable testCallable = new TestCallable();
try {
testCallable.testMethodTwo();
} catch (Exception e) {
e.printStackTrace();
}*/
iv_image = findViewById(R.id.iv_image);
nv_image = findViewById(R.id.nv_image);
button = findViewById(R.id.bt_send);
queue = Volley.newRequestQueue(getApplicationContext());
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
// UseJsonRequest();
// UseImageRequest();
// UseStringRequest();
// UseImageLoder();
UseNetWorkImageView();
}
});
}
private void UseStringRequest(){
//创建请求队列
StringRequest mStringRequest = new StringRequest(Request.Method.GET, "https://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);
}
});
//将请求加到请求队列之中
queue.add(mStringRequest);
}
private void UseJsonRequest() {
String requestBody = "ip=59.108.54.37";
JsonObjectRequest mJsonObjectRequest = new JsonObjectRequest("http://www.qubaobei.com/ios/cf/dish_list.php?stage_id=1&limit=20&page=1",null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.i("a",response.toString());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, error.getMessage(), error);
}
}
);
queue.add(mJsonObjectRequest);
}
private void UseImageRequest(){
// 直接设置一个图片
ImageRequest mImageRequest = new ImageRequest("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1594373671533&di=956a90e8240e592ab77a13854db2fb92&imgtype=0&src=http%3A%2F%2Fattach.bbs.miui.com%2Fforum%2F201401%2F23%2F095609lsejfi4thjrrwydj.jpg",
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
iv_image.setImageBitmap(response);
}
},500,500,Bitmap.Config.RGB_565,new Response.ErrorListener(){
@Override
public void onErrorResponse(VolleyError error) {
iv_image.setImageResource(R.drawable.ic_launcher_background);
}
});
mImageRequest.setTag(TAG);
queue.add(mImageRequest);
}
private void UseImageLoder(){
//先会设置一个默认的图片,当加载成功后设置加载图片
ImageLoader loader = new ImageLoader(queue,new BitmapCache());
ImageLoader.ImageListener listener = ImageLoader.getImageListener(iv_image,R.drawable.ic_launcher_background,R.drawable.ic_launcher_background);
loader.get("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1594373671533&di=956a90e8240e592ab77a13854db2fb92&imgtype=0&src=http%3A%2F%2Fattach.bbs.miui.com%2Fforum%2F201401%2F23%2F095609lsejfi4thjrrwydj.jpg",listener);
}
//NetworkImageView 在加载的时候像有缓存,加载第一次会有缓存存在
private void UseNetWorkImageView(){
ImageLoader loader = new ImageLoader(queue,new BitmapCache());
nv_image.setDefaultImageResId(R.drawable.ic_launcher_background);
nv_image.setErrorImageResId(R.drawable.ic_launcher_background);
nv_image.setImageUrl("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1594373671533&di=956a90e8240e592ab77a13854db2fb92&imgtype=0&src=http%3A%2F%2Fattach.bbs.miui.com%2Fforum%2F201401%2F23%2F095609lsejfi4thjrrwydj.jpg",loader);
}
/**
* onCreate ---> onStart -----> onResume -----> onStop -----> onDestroy
*/
@Override
protected void onStop() {
super.onStop();
// 当队列不是空,页面跳转,取消信息的加载
if(queue != null){
queue.cancelAll(TAG);
}
}
}
package com.example.customizeview.network_request;
import android.graphics.Bitmap;
import android.util.LruCache;
import com.android.volley.toolbox.ImageLoader;
public class BitmapCache implements ImageLoader.ImageCache {
//least Recently use 最近最少使用算法---->最近最少使用的将会排除掉
private LruCache<String,Bitmap>mCache;
public BitmapCache(){
//最大加载8M的图片
int maxSize = 8 * 1024 *1024;
mCache = new LruCache<String,Bitmap>(maxSize){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String url) {
return mCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url,bitmap);
}
}