Volley的使用

一、Volley简介
  • 直接用HttpURLConnection和HttpClient进行网络请求比较复杂,不进行封装的话,会有很多重复代码
  • 2013年Google I/O大会上推出了一个新的网络通信框架——Volley,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕
二、Volley的使用场景
801878.png


三、导入Volley
四、  使用Volley
  • 三种基本网络请求的实现
     第一步:新建请求队列:
        RequestQueue mQueue = Volley.newRequestQueue(context);  //一个工程用一个请求队列即可
     第二步:新建request
     第三步:把request加入请求队列
  1. StringRequest        
    Get请求:      

   mRequestQueue  = Volley.  newRequestQueue  (  this  )  ;


public void stringGetRequest() {
//新建一个字符串网络请求
//第一个参数:url--请求的网址
//第二个参数:响应监听
//第三个参数:错误监听
StringRequest request = new StringRequest("https://www.baidu.com/",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("qfstringRequest",response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {

}
});

//把请求加入队列
requestQueue.add(request);
}


    mRequestQueue  .add(request)  ;
    

   Post请求:
   接口:http://a1.greentree.cn:8029/Api/index.php/search/searchHotel

     StringRequest postStringRequest =  new  StringRequest(
        Request.Method.POST,
"http://a1.greentree.cn:8029/Api/index.php/search/searchHotel",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.
d("VolleyLesson",response);
}
}
,
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.
d("VolleyLesson",error.getMessage());
}
}
){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String,String> mapParam = new HashMap<String,String>();
// 设置参数
// pagesize 每页多少行
mapParam.put("pagesize", "20");
// pageindex 页码
mapParam.put("pageindex", "2");
return mapParam;
}
};

mRequestQueue.add(postStringRequest);
取消重复请求:
public void postStringWithCancel(View view) {

mRequestQueue.cancelAll("test");
StringRequest postStringRequest = new StringRequest(
Request.Method.
POST,
"http://a1.greentree.cn:8029/Api/index.php/search/searchHotel",
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.
d("VolleyLesson",response);
}
}
,
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.
d("VolleyLesson",error.getMessage());
}
}
){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String
,String> mapParam = new HashMap<String,String>();
// 设置参数
// pagesize 每页多少行
mapParam.put("pagesize", "20");
// pageindex 页码
mapParam.put("pageindex", "2");
return mapParam;
}
}
;
postStringRequest.setTag("test");
mRequestQueue.add(postStringRequest);
}



2.JsonRequest


JsonRequest  是一个抽象类,因此我们无法直接创建它的实例,那么只能从它的子类入手了。  JsonRequest  有两个直接的子类,  JsonObjectRequest    JsonArrayRequest     
JsonRequest jsonRequest = new JsonObjectRequest(Request.Method.POST,
"http://a1.greentree.cn:8029/Api/index.php/search/searchHotel",
new Response.Listener<JSONObject>() {
@Override
public void onResponse(
JSONObject response) {
Log.
d("volleylesson",response.toString());
}
}
,
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {

}
}
){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String
,String> mapParam = new HashMap<String,String>();
// 设置参数
// pagesize 每页多少行
mapParam.put("pagesize", "20");
// pageindex 页码
mapParam.put("pageindex", "2");
return mapParam;
}
}
;
mRequestQueue.add(jsonRequest);


3.ImageRequest


public void showImgByImageReq(){
ImageRequest imageRequest = new ImageRequest("https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/logo_white_fe6da1ec.png",
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
ivImageReq.setImageBitmap(response);
}
}, 500, 500, ImageView.ScaleType.CENTER, Bitmap.Config.ARGB_8888,
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {

}
});
mRequestQueue.add(imageRequest);

}





  • ImageLoad
      相比ImageRequest,可以设置内存缓存,可以设置加载和失败时默认显示的图片

可以使用lrucache作为内存缓存
  1. public class LruImageCache implements ImageCache{  
  2.   
  3.     private static LruCache<String, Bitmap> mMemoryCache;  
  4.       
  5.     private static LruImageCache lruImageCache;  
  6.       
  7.     private LruImageCache(){  
  8.         // Get the Max available memory  
  9.         int maxMemory = (int) Runtime.getRuntime().maxMemory();  
  10.         int cacheSize = maxMemory / 8;  
  11.         mMemoryCache = new LruCache<String, Bitmap>(cacheSize){  
  12.             @Override  
  13.             protected int sizeOf(String key, Bitmap bitmap){  
  14.                 return bitmap.getRowBytes() * bitmap.getHeight();  
  15.             }  
  16.         };        
  17.     }  
  18.       
  19.     public static LruImageCache instance(){  
  20.         if(lruImageCache == null){  
  21.             lruImageCache = new LruImageCache();  
  22.         }  
  23.         return lruImageCache;  
  24.     }  
  25.       
  26.     @Override  
  27.     public Bitmap getBitmap(String arg0) {        
  28.         return mMemoryCache.get(arg0);    
  29.     }  
  30.   
  31.     @Override  
  32.     public void putBitmap(String arg0, Bitmap arg1) {  
  33.         if(getBitmap(arg0) == null){  
  34.             mMemoryCache.put(arg0, arg1);  
  35.         }         
  36.     }  
  37.   
  38. }  



           protected void  imageLoad () {


ImageLoader.ImageCache imageCache = new ImageLoader.ImageCache() {
@Override
public Bitmap getBitmap(String url) {
return MyApp.cache.get(url);
}

@Override
public void putBitmap(String url, Bitmap bitmap) {
MyApp.cache.put(url, bitmap);

}
};
ImageLoader imageLoader = new ImageLoader(MyApp.queue, imageCache);

ImageLoader.ImageListener listener = ImageLoader.getImageListener(ivTest,R.mipmap.ic_launcher,R.mipmap.ic_launcher);

imageLoader.get("http://artcle.fd.zol-img.com.cn/t_s640x2000/g1/M07/0C/0D/Cg-4jVOpQWmIVPnYAAHFv0U3gXkAAOjOwAtyyUAAcXX661.jpg",
listener);


}

        
也可以自定义listener:
isImmediate标志是从内存缓存中加载还是从网络(或文件缓存中)加载

imageLoader.get("http://img1.goepe.com/201303/1362711681_6600.jpg",
new ImageLoader.ImageListener() {
@Override
public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
if (isImmediate) {
Logger.d("从内存缓存加载");
} else {
Logger.d("从网络加载");
}
ivTest.setImageBitmap(response.getBitmap());
}

@Override
public void onErrorResponse(VolleyError error) {

}
});
  • NetworkImageView   
解决了图片错位问题
private void showNetImg() {

ImageLoader imageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() {
@Override
public Bitmap getBitmap(String url) {
return null;
}

@Override
public void putBitmap(String url, Bitmap bitmap) {

}
});
mNetworkImageView.setDefaultImageResId(R.mipmap.ic_launcher);
mNetworkImageView.setErrorImageResId(R.mipmap.ic_launcher);
mNetworkImageView.setImageUrl("https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/logo_white_fe6da1ec.png",
imageLoader);
}


五、volley架构和源码分析
1.架构:
692885.png

RequestQueue.java:
调用  newRequestQueue时,会调用RequestQueue的start方法
public void start() {
stop(); // Make sure any currently running dispatchers are stopped.
// Create the cache dispatcher and start it.
mCacheDispatcher = new CacheDispatcher(mCacheQueue, mNetworkQueue, mCache, mDelivery);
mCacheDispatcher.start();

// Create network dispatchers (and corresponding threads) up to the pool size.
for (int i = 0; i < mDispatchers.length; i++) {
NetworkDispatcher networkDispatcher = new NetworkDispatcher(mNetworkQueue, mNetwork,
mCache, mDelivery);
mDispatchers[i] = networkDispatcher;
networkDispatcher.start();
}
}
CacheDispatcher是缓存查找线程,mCacheQueue是缓存队列,mNetworkQueue是网络下载队列,CacheDispatcher从mCacheQueue中拿request,看是否已经缓存,如果缓存,就直接读取缓存获取数据,如果没有缓存,则放入mNetworkQueue进行网络下载
NetworkDispatcher是网络下载线程,是一个线程池,默认4个线程



2.缓存
request的缓存和网络请求真正执行者
2.3之前的版本中,Http请求是通过httpClient实现,在2.3以后的版本中是通过HttpURLConnection实现,因为在2.3之前的版本中HttpURLConnection非常不稳定     
request只有文件缓存,位置:/data/data/包名/cache/volley中

Volley.java
public static RequestQueue newRequestQueue(Context context, HttpStack stack, int maxDiskCacheBytes) {
File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);

String userAgent = "volley/0";
try {
String packageName = context.getPackageName();
PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);
userAgent = packageName + "/" + info.versionCode;
} catch (NameNotFoundException e) {
}

if (stack == null) {
if (Build.VERSION.SDK_INT >= 9) {
stack = new HurlStack();
} else {
// Prior to Gingerbread, HttpUrlConnection was unreliable.
// See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html
stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));
}
}

Network network = new BasicNetwork(stack);

RequestQueue queue;
if (maxDiskCacheBytes <= -1)
{
// No maximum size specified
queue = new RequestQueue(new DiskBasedCache(cacheDir), network);
}
else
{
// Disk cache size specified
queue = new RequestQueue(new DiskBasedCache(cacheDir, maxDiskCacheBytes), network);
}

queue.start();

return queue;
}

ImageLoader内部使用的还是ImageRequest,加了内存缓存机制,所以是三级缓存


  • 练习题—修改volley源码,把本地缓存路径设置到”/sdcard/volley”中















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值