文档章节

Netroid:强大、快速、易用、可扩展基于Volley实现的Android Http库

nevans
 nevans
发布于 2014/05/07 22:15
字数 1109
阅读 11120
收藏 15
点赞 6
评论 15

简介:

Netroid是一个基于Volley 实现的Android Http库。提供异步执行网络请求、缓存返回结果、批量图片加载、大文件断点下载的常见Http交互功能。致力于避免每个项目重复开发基础Http功能,实现显著地缩短开发周期的愿景。

实现原理:

Netroid自启动后创建由开发者指定的线程数目,每个线程由 BlockingQueue 进行阻塞。当有新的请求进入队列时,其中一个线程将被唤醒并获得请求对象, 然后开始执行,执行完成后线程重新回到阻塞状态,等待下一次唤醒。Netroid实现了强大的状态回调接口在请求执行过程中进行通知, 包括开始、完成、成功、重试、失败、取消、执行网络操作、应用缓存、下载进度九种状态回调,开发者可方便地获取请求的执行情况,对用户进行友好提醒。

使用方法

Netroid库的主入口是RequestQueue,通常情况下在Application.onCreate()方法中初始化,作为全局单例对象存放:

Network network = new BasicNetwork(new HurlStack(Const.USER_AGENT, null), HTTP.UTF_8);
// RequestQueue在创建时可指定使用HttpURLConnection还是HttpClient来执行请求,同时可指定硬盘缓存的目录位置及上限大小
RequestQueue mQueue = new RequestQueue(network, 4,
    new DiskCache(new File(ctx.getCacheDir(), Const.HTTP_DISK_CACHE_DIR_NAME), Const.HTTP_DISK_CACHE_SIZE));
mQueue.start();

在需要发起Http请求时,只需要创建一个Request实例,添加入RequestQueue即可,Netroid会部署并在线程允许的情况下执行,并通过Listener的各个接口回调执行结果到主线程:

StringRequest request = new StringRequest(url, new Listener<String>() {
    ProgressDialog mPrgsDialog;

    @Override
    public void onPreExecute() {
        mPrgsDialog = ProgressDialog.show(Activity.this, null, "loading...", true, true);
    }

    // cancel the dialog with onFinish() callback
    @Override
    public void onFinish() {
        mPrgsDialog.cancel();
    }

    @Override
    public void onSuccess(String response) {
        Toast.makeText(Activity.this, "response is : " + response, 2000).show();
    }

    @Override
    public void onError(NetroidError error) {
        Toast.makeText(Activity.this, error.getMessage(), 2000).show();
    }

    @Override
    public void onCancel() {
        Toast.makeText(Activity.this, "request was cancel", 2000).show();
    }
});

// add the request to RequestQueue, will execute quickly if has idle thread
mQueue.add(request);

图片加载

使用Netroid提供的ImageLoader可以非常方便地实现图片加载功能,ImageLoader需要在初始化RequestQueue时创建,因为其作为Netroid的一个组件,依赖于Netroid的请求调用机制:

// ImageLoader在创建时可指定图片的内存缓存方案
ImageLoader mImageLoader = new SelfImageLoader(
        mRequestQueue, new BitmapImageCache(Const.HTTP_MEMORY_CACHE_SIZE));

在需要加载图片的地方,只需要调用ImageLoader的方法即可:

ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView, 0, 0);
mImageLoader.get(url, listener, 0, 0);

Netroid提供了继承自ImageView的NetworkImageView来专门处理ListView、GridView图片频繁刷新加载的问题:

...Inner Adapter
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    NetworkImageView imvCover = (NetworkImageView) convertView.findViewById(R.id.imvCover);
    imvCover.setImageUrl(book.getImageUrl(), mImageLoader);
}
...

大文件下载

Netroid实现的 FileDownloader 对断点续传方式的大文件下载提供了支持,其内部维护一个下载队列,所以在创建时需要指定最大并行任务数, 超出限制的任务将自动进入等待队列。在设置最大并行任务数后,开发者只需要往队列中不断添加任务,其它的事情均由 FileDownloader 完成。

FileDownloader的使用方法跟ImageLoader相同,在Application中创建一个单例的对象,在需要使用的地方调用接口:

FileDownloader mFileDownloader = new FileDownloader(mRequestQueue, 1);

FileDownloader将在任务添加成功时返回 DownloadController 实例对象,这个对象提供了查看任务执行状态、暂停、继续、取消四项必需的操作功能, 开发者只需要持有这个对象,即可随时掌控任务的所有情况。

public static FileDownloader.DownloadController addFileDownload(String storeFilePath, String url, Listener<Void> listener) {
    return mFileDownloader.add(storeFilePath, url, listener);
}

关于项目

Netroid开源于Github,提供完善的中文文档指引,所有更新都会第一时间发布于项目主页内,大家在使用过程中发现问题时或有不明白的地方,可以反馈到github,交流以促进项目功能的完善。

为了让开发者快速了解Netroid的所有功能点,可以下载演示程序先行查看效果。

© 著作权归作者所有

共有 人打赏支持
nevans
粉丝 11
博文 1
码字总数 1109
作品 3
广州
程序员
加载中

评论(15)

Jason_2018
Jason_2018
java.lang.IllegalThreadStateException
Thread already started
com.duowan.mobile.netroid.RequestQueue.start(RequestQueue.java:128)

代码块:
public static RequestQueue init(Context ctx) {
if (mRequestQueue == null) {
// 创建Netroid主类,指定硬盘缓存方案
Network network = new BasicNetwork(new HurlStack(null), HTTP.UTF_8);
mRequestQueue = new RequestQueue(network, RequestQueue.DEFAULT_NETWORK_THREAD_POOL_SIZE, new DiskCache(
new File(ctx.getCacheDir(), DEFAULT_CACHE_DIR), HTTP_DISK_CACHE_SIZE));
// 注:ImageLoader及FileDownloader不是必须初始化的组件,如果没有用处,不需要创建实例
mFileDownloader = new FileDownloader(mRequestQueue, 1);

mRequestQueue.start();
}
return mRequestQueue;
}
Jason_2018
Jason_2018
java.lang.IllegalMonitorStateException
com.duowan.mobile.netroid.CacheDispatcher.run(CacheDispatcher.java:91)

代码块:
public static RequestQueue init(Context ctx) {
if (mRequestQueue == null) {
// 创建Netroid主类,指定硬盘缓存方案
Network network = new BasicNetwork(new HurlStack(null), HTTP.UTF_8);
mRequestQueue = new RequestQueue(network, RequestQueue.DEFAULT_NETWORK_THREAD_POOL_SIZE, new DiskCache(
new File(ctx.getCacheDir(), "netroid"), 50 * 1024 * 1024));
// 注:ImageLoader及FileDownloader不是必须初始化的组件,如果没有用处,不需要创建实例
mFileDownloader = new FileDownloader(mRequestQueue, 1);

mRequestQueue.start();
}
return mRequestQueue;
}
南岸青栀
南岸青栀

引用来自“LostFringe”的评论

25 我把你的下载文件的给抽了出来 但是有个bug是 在下载中的 我点一下 本来要暂停的 结果直接完成了 LZ能帮忙解决下吗

引用来自“nevans”的评论

这个你说得不太清楚,你调试吧,然后做个贡献。
哥们你弄好了吗?下载的问题,
nevans
nevans

引用来自“阿不呆先生”的评论

代码混淆是否需要特殊处理呢?
反正是开源的,你直接配置不做proguard就行啦。
阿不呆先生
阿不呆先生
代码混淆是否需要特殊处理呢?
nevans
nevans

引用来自“LostFringe”的评论

还有个问题 就是如果缓存过期的话 会删除缓存 这样离线功能就实现不了了 不知如何屏蔽掉 请教
有两个方法,一:把缓存时间设得很长,然后在每次获得缓存数据时自己判断是否过期,过期则执行一次强制刷新缓存;二:添加新功能,实现过期时仍然返回旧数据,但发起新请求去刷新。 第一种可以在不改动框架代码的情况下开发者自己实现,第二种就要修改逻辑了,我暂时没有时间,求贡献。。
nevans
nevans

引用来自“LostFringe”的评论

25 我把你的下载文件的给抽了出来 但是有个bug是 在下载中的 我点一下 本来要暂停的 结果直接完成了 LZ能帮忙解决下吗
这个你说得不太清楚,你调试吧,然后做个贡献。
LostFringe
LostFringe
还有个问题 就是如果缓存过期的话 会删除缓存 这样离线功能就实现不了了 不知如何屏蔽掉 请教
LostFringe
LostFringe
25 我把你的下载文件的给抽了出来 但是有个bug是 在下载中的 我点一下 本来要暂停的 结果直接完成了 LZ能帮忙解决下吗
nevans
nevans

引用来自“yinjq”的评论

下载文件用 DownloadManager 就好, Volley 适合于数据量小的并发请求。
不赞同。如果你要做一个应用市场,你会用DownloadManager?
Android Http库--Netroid

Netroid是一个基于 Volley 实现的Android Http库。提供执行网络请求、缓存返回结果、批量图片加载、大文件断点下载的常见Http交互功能。致力于避免每个项目重复开发基础Http功能,实现显著地...

nevans
2014/05/08
5.1K
0
【转】值得推荐的android开发框架简介

第一个:Afinal 项目地址:https://github.com/yangfuhai/afinal 功能:一个android的ioc,orm框架,内置了四大模块功 能:FinalAcitivity,FinalBitmap,FinalDb,FinalHttp。通过finalActivi...

kymjs张涛
2014/08/05
0
0
网络请求框架---Volley

去年的Google I/O大会为android开发者带来了一个网络请求框架,它的名字叫做Volley。Volley诞生的使命就是让Android的网络请求更快,更健壮,而且它的网络通信的实现是基于HttpURLConnection...

Jack_1900
2014/08/01
0
2
Android常用的开源第三方库总结

主要从android整体框架、数据库(orm)、敏捷开发(注解)、网络请求、json序列化、缓存、加载网络图片和响应式编程,这几个方面去整理,并附上各个项目github和官网地址,方便开发中的取舍。 * ...

卐字旗下的余晖
2016/04/28
208
0
最美应用-从Android研发工程师的角度之[最美时光]

最美应用-从Android研发工程师的角度之最美时光 @author ASCE1885的 Github 简书 微博 CSDN 最近发现最美应用这样一个网站,它会定期推介一些很有意思的app,作为开发者,每次看到很棒的app...

2tman
2015/08/19
0
0
我心中的ANDROID REST CLIENT--9GAG

What is a good app 作为一名Android Developer,一直都想Make A Good App。很多次的我都在反问自己,我心中的Good App应该是什么样的呢?为了寻找答案,自己一直在产品、设计以及技术上都花...

android框架安卓
07/05
0
0
retrofit,okhttp

Android RxJava+Retrofit2+RxBinding RxJava+Retrofit2+RxBinding 笔记 MVP + Rxjava + Retrofit 构建项目 2015 年最值得 Android 程序猿去学习的就是 RxJava 了,关于 RxJava 就不再多描述了......

掘金官方
01/11
0
0
[转]Volley的功能及设置

olley提供了优美的框架,使android程序网络访问更容易、更快。 Volley抽象实现了底层的HTTP Client库,我们不需关注HTTP Client细节,专注于写出更加漂亮、干净的RESTful HTTP请求。 Volley...

新年
2015/07/09
0
0
Android网络通信库Volley简介

什么是Volley 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient(Apache)等,今年的Google I/O 2013上,Vol...

蜗牛TT
2013/08/05
0
0
移动跨平台方案 - LiteApp

LiteApp 是高性能的移动跨平台方案,2017年6月起由 iQiYi Android 架构团队开发。跨平台功能的实现基于 webview,并提供了不同的设计和解决方案来提高 webview 的性能。 LiteApp 致力于使开发...

匿名
04/27
0
11

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Service Mesh所应对的8项挑战

Lori Macvittie 微服务架构是把双刃剑,我们享受它带来的开发速度(development velocity),却也不得不面对服务间通讯带来的复杂性问题。 目前大多数扩展容器化微服务的架构多是基于proxy-b...

好雨云帮
18分钟前
0
0
时间复杂度

1. 维基上的定义 在计算机科学中,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低...

liuyan_lc
24分钟前
0
0
js中的~符

~是js里的按位取反操作符,~~就是执行两次按位取反,其实就是保持原值,但是注意虽然是原值,但是对布尔型变量执行这个操作,会转化成相应的数值型变量,也就是 ~~true === 1,~~false === 0...

JamesView
25分钟前
0
0
webpack安装

npm install --save-dev webpack-cli

Vincent-Duan
27分钟前
0
0
实时监听EditText内容变化

主要是addTextChangedListener方法的使用 aswerEdittext.addTextChangedListener(new TextWatcher() { //编辑框的内容发生改变之前的回调方法 @Override public void before...

王先森oO
30分钟前
0
0
python连接mysql数据库

安装好必要的pymysql插件 pip install pymysql 写好配置文档 DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), #......

南桥北木
32分钟前
0
0
linux下安装 Zookeeper

Zookeeper 注册中心安装 安装: wget http://www.apache.org/dist/zookeeper/zookeeper-3.3.3/zookeeper-3.3.3.tar.gztar zxvf zookeeper-3.3.3.tar.gzcd zookeeper-3.3.3cp conf/zoo_......

颖辉小居
34分钟前
0
0
C#判断文件的真实类型(非扩展名判断)

public static void CheckFileType() { string path = @"D:\word.doc"; System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read); ......

Lytf
35分钟前
0
0
java - 把日志生成到指定目录

1.按天小时生成日志文件 log4j.appender.ruiming.DatePattern='_'yyyy-MM-dd-HH 2.最大日志文件数据 log4j.appender.ruiming.MaxBackupIndex=100 3.下图画圈圈的很关键,是生成到知道目录必备...

轻量级赤影
36分钟前
0
0
少走弯路,给Java 1~5 年程序员的建议

今天LZ是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍。这一部分的内容,同样适用于一些希望转行到Java的同学。 在大家看之前,LZ要先声...

Java填坑之路
36分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部