`

DhNet 网络http工具(带缓存功能哦) -dhroid文档

阅读更多

网络请求是大多数应用不可获取的一部分,曾经和一个其他公司的团队一起开发,他们网络请求就是不断的写handler,代码分到了各个地方,我根本读不通

网络请求本身很简单的,写过js的都知道jquery中的ajax都很简单

不吐槽了我们开始

 

	DhNet net=new DhNet("路劲");
	net.addParam("key", "参数")
           .addParam("key2", "参数2");
	   .doGet(new NetTask(this) {
	     @Override
	      public void doInUI(Response response, Integer transfer) {
				//处理返回结果
	      }
	});

 上面是最常用的使用方法

创建一个dhnet对象  dhnet对象大多数方法是支持链式操作;

 

 

添加参数addParam的值可以为任意对象,如果非空会调用toString方法,

如果参数为为textview或其子类或调用方法getText().toString();

get或method

可以调用

 

net.setMethod("get或post")
或者
net.doGet(new NetTask(this){xxx});
net.doPost(new NetTask(this){xxx})

 

 关于对话框

 

net.doGetInDialog(new NetTask(this) {xxx});//get同时打开一个对话框
net.doPostInDialog(new NetTask(this) {xxx});//post同时打开一个对话框
net.doGet(true, new NetTask(this) {xxx});//第一个参数是否显示对话框

 对话框中的文字默认get时为 加载中...,post是为提交中...

 如果想重写

net.setDialogerMsg("对话框信息");

 

下面看NetTask回调类

主要的几个方法

//当发生错误时回调这个回调是在UI线程中
public void onErray(Response response)
//返回数据后会现在后台处理
public void doInBackground(Response response1)
//最后会在ui线程处理
public void doInUI(Response response, Integer transfer) 

有事在doInBackground处理过程中就需要处理UI这时可以

//在doInBackground添加代码
	public void doInBackground(Response response) {
		super.doInBackground(response);
		//在response中添加传递的对象
                response.addBundle("key", "对象传递");
               //传递到UI,第二个参数为自定义编码
               transfer(response, 100);
       }
//在doInUI中
	public void doInUI(Response response, Integer transfer) {
              if(transfer==100){
                   //获取传递的对象
       	          Object obj=response.getBundle("key")
            }
     }

 

下面来看response对象

response对象指返回的数据

response方法很多

String res=response.plain()//可以获取网络访问的纯文本

 当然我们基本网络访问都是json

JSONObject jo=response.jSON()//可以返回网络访问的json对象

网络默认最佳返回格式,当然不是必须的

{
     success:true,
     msg:'消息内容',
     code:'error'
     data:{}
}

  

 对应的配置

下面是Const中的配置你可以进行覆盖

public class Const{	
        public static String response_success = "success";//成功与否
	public static String response_msg = "msg";//消息文本
	public static String response_data = "data";//数据对象
	public static String response_total = "total";//暂时没用
	public static String response_current = "current";//暂时没用
	public static String response_code = "code";//错误code
}

 有了这些后

//假设返回的结果 
{success:true,
  data:{
   user:{
      id:1212,
      name:'tengzhinei'
      }   
   },
   articles:[
      {id:1},
      {id:2}
    ] 
  }	
//json处理
boolean success=response.isSuccess();//是否成功,
JSONObject jo = response.jSONFromData();//获取data节点下的对象
JSONObject data = response.jSONFrom("data");;//获取data节点下的对象
JSONObject user = response.jSONFrom("data.user");//获取data.user节点下的对象
JSONArray array = response.jSONArrayFrom("data.articles");//获取data.articles节点下的数组

//也可以直接将json转为bean
User user = response.modelFrom("data.user");//可以直接获取到user对象(这边使用了泛型)
List<Article> articles = response.listFrom(User.class, "data.articles")//获取对象数组

  response 很强大吧

 

 

 

 

 

 

这里在顺便说一下ViewUtil 和JSONUtil 

下面是我喜欢使用的数据绑定方法

 

 

         
 ViewUtil.bindView(findViewById(R.id.time), JSONUtil.getLong(jo, "time"),"time");
//第一个参数view 可以为textview或其子类 ,imageView//如果是imageview  如果第二个参数是字符串会自动下载图片,如果是drawable,bitmap,int或获取直接绑定图片
//第二个数 数据
//第三个数 数据修饰  //这里将数据修饰为时间类型,具体修饰问题在后面讲adapter再讲吧

 

 

继续,说过dhnet自带强大的网络缓存下面就说怎么使用吧

 

	DhNet net=new DhNet();
net.setUrl("http://youxianpei.c.myduohuo.com/mobile_index_adbjsonview?id=63&temp=cache_net_error");
//看这里使用缓存策略
net.useCache(CachePolicy.POLICY_ON_NET_ERROR);
net.doGet(new NetTask(getActivity()) {
	@Override
	public void doInUI(Response response, Integer transfer) {
		resultV.setText(response.plain());
		   //response有方法判断这次结果是不是缓存
                  if (!response.isCache()) {
			dialoger.showToastShort(getActivity(), "这次访问不是使用的缓存,断开网络试试看");
                  }else{
	               dialoger.showToastShort(getActivity(), "网络访问失败,这次使用的是缓存");
		}
	}
});

    net.useCache(CachePolicy.XXX);//就可以添加缓存策略了

 

   现在有的缓存策略

     //不使用缓存

   POLICY_NOCACHE;

    //只使用缓存

    POLICY_CACHE_ONLY;

    //先使用缓存,然后获取但是获取的数据只会缓存起来

    POLICY_CACHE_AndRefresh;

    //当网络不好时,才会使用缓存

    POLICY_ON_NET_ERROR;

    //先使用缓存,然后获取,获取后会再使用

    POLICY_BEFORE_AND_AFTER_NET;

 

  这些缓存策略都好理解,唯一需要说的POLICY_BEFORE_AND_AFTER_NET 

  其他策略的doInBackground和doInUI只会被回调一次

  但是POLICY_BEFORE_AND_AFTER_NET 

  doInBackground和doInUI  可能 会被回调两次,一次是上次缓存(如果上次没缓存当然不会回调),一次真正的网络获取的数据

//网络缓存简单吧

 

在告诉大家一个秘籍

 

Const.net_error_try=true;

 如果这个值被设为true,在doInBackground和doInUI中发生的错误都会被try-catch掉主要是项目上线后,

 

项目开发过程中还是false 吧

 

下面文件上传

 

		DhNet net=new DhNet("路径");
		net.addParam("key1", "参数1")
		.addParam("key2", "参数2").upload("文件参数名", file, new NetTask(this) {
			@Override
			public void doInUI(Response response, Integer transfer) {
				if (response.isSuccess()) {
					Boolean uploading = response.getBundle("uploading");
					if (!uploading) {
						//上传完成
					}else{
						//已上传大小
						long length= response.getBundle("length");
						//文件总大小
						long total=  response.getBundle("total");
					}
				}
			}
		});

 //上面的代码就是文件上传了,主要就是使用upload方法

 

在doInUI会被多次回调用来处理进度,response中有uploading,length,total三个参数用来判断进度

 

   最后文件下载

 

//文件下载需要注入
@Inject
DownLoadManager downloader;

//启动下载
downloader.download("任务编码","路劲",params,"本地保存路径");//第三个参数附加参数
//注册下载监听
downloader.regeisterCallBack("任务编码",downLoadCallBack);
//取消下载监听
downloader.unregeisterCallBack("任务编码");

   可以在activity的onResume监听,onStop中取消监听  特别是一些需要在listview 中显示下载进度的

 

 

  关于同步网络访问,这些不说

      NetUtil.sync(url, method, params);

       NetUtil.syncStream(url, method, params);

  再底层

     HttpManager.execute(HttpGet);

   

Dhnet 网络就这些东西,基本涉及到网络的方方面面

分享到:
评论
1 楼 xyyx_nk 2014-09-16  
在demo中没有下载的示例,能详细说一下怎么监听下载过程吗?

比如,要在一个进度条中实现下载进度,该怎么办?

相关推荐

    发卡系统源码无授权版 带十多套模板

    发卡系统源码无授权版 带十多套模板

    STM32F103系列PWM输出应用之纸短情长音乐——无源蜂鸣器.rar

    STM32F103系列PWM输出应用之纸短情长音乐——无源蜂鸣器

    基于matlab开发的rvm回归预测 RVM采取是与支持向量机相同的函数形式稀疏概率模型,对未知函数进行预测或分类.rar

    基于matlab开发的rvm回归预测 RVM采取是与支持向量机相同的函数形式稀疏概率模型,对未知函数进行预测或分类.rar

    STM32 CubeMX FreeRtos系统 基于lwRB通用环形缓冲区的串口非阻塞发送

    STM32工具 CubeMX 使用FreeRtos系统 基于lwRB通用环形缓冲区的串口非阻塞发送,程序使用printf,通过重定向fputc函数,将发送数据保存在FIFO中,可以在中断中调用printf,保证了系统的线程安全和中断安全,将发送任务放在线程中。LwRB有两个指针一个r读指,一个w写指针,底层采用原子操作,不需要用到锁,保证了线程安全,最大的好处是它是支持DMA的,为CPU减负。

    整站程序EasyJF官网全站源码-easyjfcom-src.rar

    EasyJF官网全站源码_easyjfcom_src.rar是一个针对计算机专业的JSP源码资料包,它包含了丰富的内容和功能,旨在帮助开发人员快速构建和管理网站。这个源码包基于Java技术栈,使用JSP(JavaServer Pages)作为前端页面渲染技术,结合了Servlet、JavaBean等后端组件,为开发者提供了一个稳定、高效的开发环境。通过使用这个源码包,开发者可以快速搭建一个具有基本功能的网站建设平台。它提供了用户注册、登录、权限管理等基本功能,同时也支持文章发布、分类管理、评论互动等常见内容管理操作。此外,源码包还包含了一些实用的辅助工具,如文件上传、数据导出等,方便开发者进行网站的维护和管理。在界面设计方面,EasyJF官网全站源码采用了简洁、易用的设计风格,使得用户可以轻松上手并进行个性化定制。同时,它还提供了一些可扩展的插件和模板,开发者可以根据自己的需求进行修改和扩展,实现更多的功能和效果。总之,EasyJF官网全站源码_easyjfcom_src.rar是一个功能强大、易于使用的计算机专业JSP源码资料包,适用于各类网站建设项目。无论是初学者还是有经验的开发者

    node-v11.13.0-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v12.10.0-win-x86.zip

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v10.2.1-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于matlab实现此压缩包包含语音信号处理中的语音变声代码加音频.rar

    基于matlab实现此压缩包包含语音信号处理中的语音变声代码加音频.rar

    node-v6.10.2.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    Java 中将 UUID 存储为 Base64 字符串

    使用 Base64 编码来对 UUID(Universally Unique Identifiers) 存储在一些特定的场合被广泛的使用。使用 Base64 对比直接使用 UUID 进行存储来说能够更多的节约空间。 本文对这方面的相关内容和问题进行探讨。 在这里,使用 Base64 来对 UUID 进行存储,涉及到一些类型的转换的。Base64 是编码算法,在实际使用的时候我们更多会用到 Byte 数组的方式来进行编码的。这样我们就比较明确在对其进行 Base64 转换之前,我们应该要先干什么了。

    Java网络爬虫(蜘蛛)源码.zip

    Java网络爬虫(蜘蛛)源码.zip

    pandas数据分析学习

    这是Pandas基础学习

    毕业设计基于STM32的桌面电子时钟的设计与实现硬件端系统源码.zip

    架构 主微控制器采用 STM32F103C8T6。 目前外设部分包括: 显示模块:0.96寸4针IIC通信协议的OLED模块 温湿度采集模块:DHT11 网络通信模块:ESP8266 报警模块:高电平触发的有缘蜂鸣器 其他:若干LED灯珠以及若干贴片按键 硬件端系统使用C语言编写

    新版PHP无陌然在线云加密平台系统源码 带安装说明.rar

    新版PHP无陌然在线云加密平台系统源码 带安装说明.rar新版PHP无陌然在线云加密平台系统源码 带安装说明.rar

    记账管理系统的设计与实现

    近年来由于生活节奏的加快,好像每个人都被很多难以启齿的问题困惑,然而关于随意消费是大多数人头疼的问题,没有任何计划和筹备的情况下随意消费,导致现实生活中我们所称为的“月光族”。 当你逐渐了解自己的财务状况,就可以学着做简单的收支规划。大部分月光族的根源其实是缺乏规划,想买什么的时候就买了。并不是说规划不能随意买东西,规划的价值在于让你使用资金的效率最高。无论你用金钱换取的必需品,满足感或者快乐,都可以通过规划获得比较高的效率。 本记账系统是一个基于国内外电子商务网站的发展现状,采用B2C(Business to Consumers)模式开发的电子商务平台,它的价值所在对于那些随意消费性的人群能起到一个很大的警示作用,而且系统扩张性很强,能根据客户的不同需求进行快速改进。该系统采用B/S三层结构,服务器是Tomcat同时运用JSp技术进行动态页面设计,后台数据库是Oracle。

    最新微信文章编辑器排版工具程序源码.rar

    最新微信文章编辑器排版工具程序源码.rar最新微信文章编辑器排版工具程序源码.rar最新微信文章编辑器排版工具程序源码.rar

    249ssm-mysql-jsp 疫情冷链追溯系统.zip(可运行源码+数据库文件+文档)

    前台方面(经营者用户): 系统首页:是用这户端的系统首页,首页的最上方有投诉建议、进入后台等选项,页面下方可以根据商品编号进行商品状态的实时查询,十分方便快捷。 投诉建议:用户可以在这个系统的这个板块给系统开发者留言,向开发者反应系统使用者的疑难问题,并提出自己相应的改进建议。 商品入库:生鲜商品经营者可以在商品入库界面,对一定数量的生鲜商品进行入库操作,确保库房内的每一件商品都能追根溯源,保障产品质量安全。 商品出库:用户在商品出库界面,可以对指定的商品进行出库操作,输入出库数量,点击提交即可。 商品列表:用户还可以在商品列表的界面中,对自己旗下生鲜商品的入库、出库情况进行实时查看。 后台方面(管理者用户): 商品管理:商品管理是系统后台的核心功能,在这个功能模块中,系统管理员可以对平台内生鲜商品的出入库指令进行严格的审核,并且可以对商品的归属地追根溯源。 经营者管理:拥有最高管理权限的系统管理员,可以连接到数据库,对经营者类别、名称、经营许可证编号等基础信息进行审核。 投诉建议管理:管理员还可以对所有注册用户的投诉建议,进行删除或者回复操作,通过这种方式,与注册用户进行线上交流。

    MyBatis 动态 SQL 示例

    MyBatis 是一个持久层框架,它允许用户在 XML 文件中编写动态 SQL 语句。MyBatis 的动态 SQL 功能非常强大,它允许开发者根据运行时的条件动态地生成 SQL 语句。这使得 MyBatis 能够灵活地处理各种复杂的查询需求。 MyBatis 动态 SQL 通过使用 <if>、<choose>、<when>、<otherwise>、<trim>、<set> 等标签来实现。附件中是一些常见的动态 SQL 标签及其用法,通过组合使用这些标签,可以编写出非常灵活和强大的 SQL 语句,以适应不同的查询和更新需求

Global site tag (gtag.js) - Google Analytics