算了一下,好像有很久没有写博客了。其实,关于写博客这件事,我从来没有把他当成我的一种任务,而是在学习过程中的一种总结和自我发现,同样也是为了练一练文笔,说不定有一天,我也能出一本书像《第一行代码》,《安卓从小工到专家》,《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. 利用javascript:void(0)制作假的提交按钮替代button

    在写html页面,我们很自然的在表单提交的地方采用button来作为提交按钮,但是,用<button type=”button”>按钮</button>作为提交代码会有个问题, ...

  2. c++下为使用pimpl方法的类编写高效的swap函数

    swap函数是c++中一个常用的函数,用于交换两对象的值,此外还用于在重载赋值运算符中处理自赋值情况和进行异常安全性编程(见下篇),标准模板库中swap的典型实现如下: namespace stl { ...

  3. Winform开发常用控件之DataGridView的简单数据绑定——代码绑定DataSet、DataTable、IList、SqlDataReader

    前文介绍了Winform为DataGridView提供的数据自动绑定功能,下面介绍一下采用代码的数据绑定 1.用DataSet和DataTable为DataGridView提供数据源 先上代码 pri ...

  4. MyBatis的一对一

    1. 建立好工程后,在pom.xml中配置myBatis的依赖. <project xmlns="http://maven.apache.org/POM/4.0.0" xml ...

  5. test20181018 B君的第一题

    题意 分析 考场爆零做法 考虑dp,用\(f(i,j,0/1)\)表示i及其子树中形成j个边连通块的方案数,其中i是否向外连边. \(O(n^3)\),转移方程太复杂就打挂了. #include< ...

  6. vue使用百度编辑器ueditor踩坑记录

    一.使用 下载放入项目 main.js引入 import '../static/UE/ueditor.config.js'; import '../static/UE/ueditor.all.js'; ...

  7. 设置vim颜色方案

    获取所有vim颜色配置方案 ls /usr/share/vim/vim74/colors/ [root@lx ~]# ls /usr/share/vim/vim74/colors/ blue.vim ...

  8. Apache Commons Codec 与消息摘要算法(hash算法)

    首先我们要明白 Codec 是什么含义.它是 Coder + decoder = Codec,也就是编码器解码器.即是编码器,也是解码器. 官网地址:http://commons.apache.org ...

  9. 学习blus老师js(3)--定时器的使用

    1.无缝滚动——基础 物体运动基础 让Div移动起来 offsetLeft的作用 用定时器让物体连续移动   offsetLeft: 获取物体的左边距:最大的优点在于可以综合考虑所有影响这个物体位置的 ...

  10. 【ZZ】国外大型网站使用到编程语言 | 菜鸟教程

    http://www.runoob.com/w3cnote/rogramming-languages-used-in-most-popular-websites.html 下图展示了大型网站使用到的后 ...