Netroid:强大、快速、易用、可扩展基于Volley实现的Android Http库
博客专区 > nevans 的博客 > 博客详情
Netroid:强大、快速、易用、可扩展基于Volley实现的Android Http库
nevans 发表于4年前
Netroid:强大、快速、易用、可扩展基于Volley实现的Android Http库
  • 发表于 4年前
  • 阅读 10962
  • 收藏 14
  • 点赞 6
  • 评论 13
摘要: Netroid基于Volley库的理念,并在其基础上做了大量扩展,提供执行网络请求、缓存返回结果、批量图片加载、大文件断点下载的常见Http交互功能。致力于避免每个项目重复开发基础Http功能,实现显著地缩短开发周期的愿景。

简介:

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的所有功能点,可以下载演示程序先行查看效果。

共有 人打赏支持
粉丝 12
博文 1
码字总数 1109
作品 3
评论 (13)
tanranran
观察了好久,准备今天开始集成到项目中
mkrcpp
我本来想自己封装 volley ,发现 耗时的上传下载不适宜集成在 volley 中,楼主的方式是另开了线程,专门处理下载,觉得还不错
mkrcpp
另外,还有上传到额问题还没有集成
nevans

引用来自“mkrcpp”的评论

另外,还有上传到额问题还没有集成
上传需要在开发过程中搭建服务端来测试,我暂时没有这个精力。
yinjq
下载文件用 DownloadManager 就好, Volley 适合于数据量小的并发请求。
nevans

引用来自“yinjq”的评论

下载文件用 DownloadManager 就好, Volley 适合于数据量小的并发请求。
不赞同。如果你要做一个应用市场,你会用DownloadManager?
LostFringe
25 我把你的下载文件的给抽了出来 但是有个bug是 在下载中的 我点一下 本来要暂停的 结果直接完成了 LZ能帮忙解决下吗
LostFringe
还有个问题 就是如果缓存过期的话 会删除缓存 这样离线功能就实现不了了 不知如何屏蔽掉 请教
nevans

引用来自“LostFringe”的评论

25 我把你的下载文件的给抽了出来 但是有个bug是 在下载中的 我点一下 本来要暂停的 结果直接完成了 LZ能帮忙解决下吗
这个你说得不太清楚,你调试吧,然后做个贡献。
nevans

引用来自“LostFringe”的评论

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

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

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

引用来自“LostFringe”的评论

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

引用来自“nevans”的评论

这个你说得不太清楚,你调试吧,然后做个贡献。
哥们你弄好了吗?下载的问题,
×
nevans
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: