文档章节

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

nevans
 nevans
发布于 2014/05/07 22:15
字数 1109
阅读 11154
收藏 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
Xutils, OKhttp, Volley, Retrofit对比

Xutils这个框架非常全面,可以进行网络请求,可以进行图片加载处理,可以数据储存,还可以对view进行注解,使用这个框架非常方便,但是缺点也是非常明显的,使用这个项目,会导致项目对这个框...

安卓笔记侠
08/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

零拷贝I:用户模式视角

英文原文地址:http://www.linuxjournal.com/article/6345。内容是关于 Zero Copy(零拷贝) 的详细介绍。在RocketMQ的Consumer 消费消息过程,使用了零拷贝技术。作用是即使被频繁调用,文件传...

Jacktanger
14分钟前
8
0
记在k8s的pod上使用apache的commons-net:ftp功能时,ftp一直上传文件失败

在k8s的pod上使用apache的commons-net:ftp功能时,一直显示: 即上传文件失败,但是在本地环境进行上传时却又显示上传成功,让人十分不解。在网上搜索了一下ftp的一些资料发现ftp共有两种模式...

helplove
15分钟前
1
0
Go map实现原理

map数据结构 Golang的map使用哈希表作为底层实现,一个哈希表里可以有多个哈希表节点,也即bucket,而每个bucket就保存了map中的一个或一组键值对。 map数据结构由runtime/map.go/hmap定义:...

恋恋美食
22分钟前
1
0
debian python library re-install

apt-get install python-aptsudo apt-get install python-pkg-resources python-setuptools --reinstall...

关上越
26分钟前
1
0
Elasticsearch地理位置总结

更多内容请参考 : https://www.felayman.com 翻译版本:https://es.xiaoleilu.com/310_Geopoints/00_Intro.html 官方原文:https://www.elastic.co/guide/en/elasticsearch/guide/current/g......

xiaomin0322
27分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部