算了一下,好像有很久没有写博客了。其实,关于写博客这件事,我从来没有把他当成我的一种任务,而是在学习过程中的一种总结和自我发现,同样也是为了练一练文笔,说不定有一天,我也能出一本书像《第一行代码》,《安卓从小工到专家》,《App研发录》等等这样的书。人生短短数十载,总要留下些什么。好像说的有点多,话不多说。来谈谈今天的主要内容。我总在一些交流群中看到有人说,那个XXX二次封装的OkHttp如何怎样怎样。其实,当我看到他这样说的时候我在想,为什么不自己进行二次封装同样更加满足自己的需求呢?也许你会觉得这东西很难,人家有现成的东西为什么不用呢?我觉得,前提是你要理解了才能拿来用。话不多说,拿一个我自己做的Demo给大家看一看。

这个小东西,我所使用的是Volley,并且实现了对Volley的简单二次封装。这里写出来,希望对你有所启发。

数据方面,由于调用的是聚合上的免费API,返回的数据是Json。在安卓中处理Json,其实首选是想Gson,fastJson,这样的框架。因为我Gson用的比较多,并且关于写JavaBean对象,Android Studio 也有jsonformat这样的小插件可以快速实现,省去了很多时间。

***Volley整合Gson**

好在Volley提供了一个Request类帮助我们实现自定义的Request。所以实现起来并不复杂。我们希望,从我们自定义的Requet中能够直接返回我们的JavaBean对象,便于我们对数据的操作。实现代码:

public class ApiJsonRequest<T>extends Request<T>{
private Class<T> clazz;
private Response.Listener<T> mListener;
private Gson gson;
private int position; public ApiJsonRequest(int method, String url, Response.ErrorListener errorListener,
Response.Listener<T> listener, Class<T> clazz) {
super(method, url, errorListener);
this.mListener=listener;
this.clazz=clazz;
} @Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
String json;
try {
json=new String(response.data, HttpHeaderParser.parseCharset(response.headers));
} catch (UnsupportedEncodingException e) {
json=new String(response.data);
}
T obj;
try {
if (gson==null) {
gson = new Gson();
}
obj=gson.fromJson(json,clazz);
return Response.success(obj,HttpHeaderParser.parseCacheHeaders(response));
}catch (Exception e) {
return Response.error(new ParseError());
} } @Override
protected void deliverResponse(T response) {
mListener.onResponse(response);
}
}

可以看到,这里主要有三个方法需要我们去实现。构造方法中,我们传入一个请求成功的监听。由于我们需要返回JavaBean对象,但是却不知道这个JavaBean对象具体指向谁,所以这里可以传入一个泛型T,在实现这个Request的时候就指定JavaBean对象用于Gson解析。之后再parseNetworkResponse中通过NetworkResponse拿到调用String类的构造方法,将二进制字节组转换为一个Java字符串,用于我们的Gson解析,为了防止Gson对象在数据请求的时候被重复调用,要在初始化时进行判空。最后调用Json.fromJson将这个对象Response出去;deliverResponse这个方法主要用于决定我们返回的数据对象。下面是使用:

private void getData() {
ApiJsonRequest<NewsParseBean> apiJsonRequest = new ApiJsonRequest<>(Request.Method.GET,
NewsBean.requestUrl + type + NewsBean.apiKey, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) { }
}, new Response.Listener<NewsParseBean>() {
@Override
public void onResponse(NewsParseBean response) {
//获取最新数据
processData(response);
//显示新闻
showNews(); }
}, NewsParseBean.class,position);
apiJsonRequest.setTag(getClass().getSimpleName());
requestQueue.add(apiJsonRequest);
}

一个简单的整合Gson的Volley就写完了。是不是很简单?

***整合LruCache***

上图那个小Demo,运行起来是十分的流畅。在图片加载方面,我所使用的是Android中的LruCache。一种内存缓存策略,你能看到,其实加载速度是非常的快,非常的流畅的。附上代码:

public class ApiImageCache implements ImageLoader.ImageCache {
private LruCache<String,Bitmap>lruCache;
private static int maxSize= ApiConstant.IMAGE_SIZE;
private static ApiImageCache instance;
private ApiImageCache() {
lruCache=new LruCache<String, Bitmap>(maxSize){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getByteCount()/1024/1024;
}
};
}
public static synchronized ApiImageCache getInstance () {
if (instance==null) {
instance=new ApiImageCache(){};
}
return instance;
}
@Override
public Bitmap getBitmap(String url) {
return lruCache.get(url);
} @Override
public void putBitmap(String url, Bitmap bitmap) {
lruCache.put(url,bitmap); }
}

在实现Volley加载图片的时候需要我们对图片进行自定义的处理,这里实现ImageLoader.ImageCache就可以了。之后,我为了方便,将它写成单例。在构造方法中使用LruCache进行图片加载处理。实现很简单,需要注意的是LruCache返回的是图片的大小。

Volley:

public class ApiVolleyUtils {
private static ApiVolleyUtils instance;
private static RequestQueue requestQueue;
private static ImageLoader imageLoader;
private static ImageLoader.ImageCache imageCache; public RequestQueue getRequestQueue() {
return requestQueue;
} public ImageLoader getImageLoader() {
return imageLoader;
} public ImageLoader.ImageCache getImageCache() {
return imageCache;
} private ApiVolleyUtils(Context context){
requestQueue= Volley.newRequestQueue(context);
imageCache=ApiImageCache.getInstance();
imageLoader=new ImageLoader(requestQueue,imageCache); }
public static ApiVolleyUtils getInstance(Context context) {
if (instance==null) {
synchronized (ApiVolleyUtils.class){
if (instance==null) {
instance=new ApiVolleyUtils(context);
}
}
}
return instance;
} }

使用:

ImageLoader imageLoader = apiVolleyUtils.getImageLoader();
if (!NetUtils.isNetWork(UIUtils.getContext())) {
// getDiskImage(holder, diskLruCache, key);
} else {
//getNetDisk(position, diskLruCache, key);
imageLoader.get(respondList.get(position).getThumbnail_pic_s(),
new ImageLoader.ImageListener() {
@Override
public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) {
holder.ivNews.setImageBitmap(response.getBitmap());
}
@Override
public void onErrorResponse(VolleyError error) { }
});

好了,关于这个小Demo中的Volley网络模块接介绍完了,关于这些框架,我们不仅需要学习如何使用跟重要的是,要学会如何对框架进行二次封装,满足自己的实际需要。希望这篇博客对你有所启发。

Volley的简单封装的更多相关文章

  1. Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池

    前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ...

  2. FMDB简单封装和使用

    工具:火狐浏览器+SQLite Manager插件 ; Xcode; FMDB库; 效果: 项目地址: https://github.com/sven713/PackFMDB 主要参考这两篇博客: 1 ...

  3. Android--Retrofit+RxJava的简单封装(三)

    1,继续接着上一篇的讲讲,话说如果像上一篇这样的话,那么我们每一次请求一个结构都要创建一堆的Retrofit对象,而且代码都是相同的,我们可以试试封装一下 先创建一个HttpMethods类,将Ret ...

  4. okhttp3 get post 简单封装

    最近打算在新项目中使用 okhttp3, 简单封装了一下异步 get post 因为 CallBack 也是在子线程中执行,所以用到了 Handler public class MyOkHttpCli ...

  5. python网页请求urllib2模块简单封装代码

    这篇文章主要分享一个python网页请求模块urllib2模块的简单封装代码. 原文转自:http://www.jbxue.com/article/16585.html 对python网页请求模块ur ...

  6. 对pymysql的简单封装

    #coding=utf-8 #!/usr/bin/python import pymysql class MYSQL: """ 对pymysql的简单封装 "& ...

  7. iOS开发——UI篇OC篇&UITableView简单封装

    UITableView简单封装 UITableView时iOS开发中使用最多也是最重的一个UI空间,其实在App Store里面的%80以上的应用都用到了这个控件,所以就给大家介绍一下,前面的文章中也 ...

  8. iOS sqlite 增删改查 简单封装(基于 FMDB)

    /** *  对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查 * *  基于 FMDB * *  操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整 ...

  9. ADO简单封装(MFC)

    简单封装了一下,不是很严谨. /************************************************************************/ /* INSTRUC ...

随机推荐

  1. centos7.3安装配置vsftp

    首先使用命令查看,系统内是否安装了vsftp [root@instance_290388 down]# rpm -qa |grep vsftp 如果没有安装,使用命令,进行安装 [root@insta ...

  2. L206

    There are so many new books about dying that there are now special shelves set aside forthem in book ...

  3. New Concept English Two 11 28

    $课文26 最佳艺术评论家 256. I am an art student and I paint a lot of pictures. 我是个学艺术的学生,画了很多画. 257. Many peo ...

  4. Ubuntu上交叉编译valgrind for Android 4.0.4的过程与注意事项

    编译环境:Ubuntu x86_64(Linux root 2.6.32-45-generic #101-Ubuntu SMP Mon Dec 3 15:39:38 UTC 2012 x86_64 G ...

  5. 《DSP using MATLAB》示例 Example 9.11

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  6. NET怎么精确计算一个对象占用的内存空间(GMK)

    NET如何精确计算一个对象占用的内存空间(GMK)如题 我最近做了一个类似Session的东西 但是我不知道最后管理起来他又多大 所以内存 对象 管理 session 类 分享到: ------解决方 ...

  7. centos6.5下tomcat安装

    1.安装JDK 安装:rpm –ivh jdk-7u5-linux-i586.rpm2.配置Tomcat 解压:tar -zxvf apache-tomcat-8.0.11.tar.gz 移动到/us ...

  8. Jquery中的has、find、filter方法区别

    find方法 find返回的是匹配结果集,作用于后代$(‘li’).find(‘.a’).css(‘background-color’, ‘red’);在li下面查找元素是否有class=a的元素,返 ...

  9. (判断)window.open()窗口被关闭后执行事件

    $(function() { // start ready var $article_share=$('#body .article').find('li.share'); // $article_s ...

  10. JZ2440 裸机驱动 第5章 GPIO接口

    本章目标:     掌握嵌入式开发的步骤:编程.编译.烧写程序.运行     通过GPIO的操作了解软件如何控制硬件 5.1 GPIO硬件介绍     S3C2440A有130个多功能输入/输出口引脚 ...