基于okhttp的异步请求

抽空封装了一下基于okHttp的网络请求,刚刚封装好get,post, download,upload请求,不需要创建线程,支持Json自动转换 。

Get和Post(文件上传也属于Post)主要分俩个步骤:

1.通过HttpRequestBuilder来创建请求实体对象。

2.通过HttpUtil的sendRequest方法来发送请求,并且使用ResultCallBack来接受返回内容,这个步骤中成功时,自动将json转换为实体,若失败会执行ResultCallBack的onError 方法,并传递HttpException,这个对象中包含http错误代码,比如404,500等。

get请求方式:

private void getSample() {

		HttpRequest request = new HttpRequestBuilder().url(url)
				.addHeader("cookie", "df").addParams("key", "value")
				.method(HttpMethod.GET).build();

		HttpUtil.getInstance().sendRequest(request, new ResultCallBack<Result>() {

			@Override
			public void onResponse(Result response) {
				// TODO Auto-generated method stub
				textView.setText(response.getData().getName());
			}

			@Override
			public void onError(Request request, HttpException httpException) {
				// TODO Auto-generated method stub
				textView.setText("requestCode:"+httpException.getResponseCode()+"  ErrorMessage:"+httpException.getMessage());
			}
		});
	}

post请求:

private void postSample() {

		HttpRequest request = new HttpRequestBuilder()
				.url("http://www.oschina.net/action/user/hash_login")
				.addHeader("cookie", "df").addParams("email", "xxxxxxxxx")
				.addParams("pwd", "xxxxxxxxxxxxxxxxx")
				.method(HttpMethod.POST).build();

		HttpUtil.getInstance().sendRequest(request,
				new ResultCallBack<String>() {

					@Override
					public void onError(Request request,
							HttpException httpException) {
						// TODO Auto-generated method stub

					}

					@Override
					public void onResponse(String response) {
						// TODO Auto-generated method stub
						textView.setText(response);
					}
				});

	}

文件上传:

private void fileUploadSample() {
		if (!TextUtils.isEmpty(textView.getText())) {
			File file = new File(textView.getText().toString());
			final String url = "服务器地址。。。";

			HttpRequest request = new HttpRequestBuilder()
					.url(url)
					.method(HttpMethod.POST)
					.addFile(
							new FileDiscription(file)
									.setUploadPrograssListener(fileUploadListener))
					.build();

			HttpUtil.getInstance().sendRequest(request,
					new ResultCallBack<String>() {

						@Override
						public void onError(Request request,
								HttpException httpException) {
							// TODO Auto-generated method stub

						}

						@Override
						public void onResponse(String response) {
							// TODO Auto-generated method stub
							textView.setText(response);
						}
					});
		}
	}

文件下载是Get请求,只不过没有使用ResultCallBack而是使用了DownloadCallBack,可以监听下载进度,有完成和失败的回调。代码如下:

private void downLoad(){
		HttpRequest request= new HttpRequestBuilder()
		.url("http://img.taopic.com/uploads/allimg/130501/240451-13050106450911.jpg")
		.method(HttpMethod.GET).downLoadPath(filePath, String.valueOf(new Date().getTime())+".jpg").build();

		HttpUtil.getInstance().downLoad(request, new DownLoadCallBack() {

			@Override
			public void onDownLoading(int prograss) {
				// TODO Auto-generated method stub
				textView.setText(prograss+"%");
				progressBar.setProgress(prograss);
			}

			@Override
			public void onDownLoadSuccess() {
				// TODO Auto-generated method stub
				textView.setText("down load success");
			}

			@Override
			public void onDownLoadFail(HttpException ex) {
				// TODO Auto-generated method stub
				textView.setText(ex.getMessage());
			}

		});
	}

源码地址:

https://github.com/YounMario/HttpDemo

时间: 2024-10-16 20:16:19

基于okhttp的异步请求的相关文章

在Silverlight中的DispatcherTimer的Tick中使用基于事件的异步请求

需求:在silverlight用户界面上使用计时器定时刷新数据. 在 Silverlight 中的 DispatcherTimer 的 Tick 事件 中使用异步请求数据时,会出现多次请求的问题,以下是ViewModel的代码,看样子没什么问题: using System; using System.Net; using System.Threading; using System.Windows; using System.Windows.Controls; using System.Wind

Android探索之基于okHttp打造自己的网络请求(一)

前言: 之前项目中一直使用的Xutils开源框架,从xutils 2.1.5版本使用到最近的xutils 3.0,使用起来也是蛮方便的,只不过最近想着完善一下app中使用的开源框架,由于Xutils里面包含的东西相对来说比较杂,有数据库.图片缓存.注解.网络请求等等,秉着一个开源库只处理一件事的想法,决定逐步替换到Xutils,上网搜了一下比较好的开源框架,就找到了okHttp.volley.android-async-http等比较推荐的开源网络请求,该如何选择呢? okHttp.volley

OkHttp面试之--OkHttp的整个异步请求流程

通过上一节,我们已经了解了如何使用OkHttp发送异步请求,下载网络图片信息并显示到ImageView控件上,从这一节开始我们就来开始研究一下其内部的实现流程和原理.因为整个流程相对而言还是比较复杂,因此对于流程的分析我划分成以下几个章节去介绍 流程概述 拦截器的原理 HttpEngine中sendRequest的流程分析 HttpEngine中readResponse的流程分析 这一节我们先来看一下整个流程的概述,先上一张时序图 以上图片来自http://www.jianshu.com/p/d

带你一步步剖析Retrofit 源码解析:一款基于 OkHttp 实现的网络请求框架

OkHttp与Retrofit 的区别与联系是怎样的? 参考答案:OkHttp和Retrofit都是目前流行网络开源框架 封装不同:Retrofit封装了具体的请求,线程切换以及数据转换.retrofit通过使用代理,外观,策略模式对okhttp进行了封装OkHttp 是基于Http协议封装的一套请求客户端 职责不同:Retrofit主要负责应用层面的封装,面向开发者,方便使用,比如请求参数,响应数据的处理,错误处理等等.OkHttp主要负责socket部分的优化与封装,比如网络访问,多路复用,

Android探索之基于okHttp打造自己的网络请求(三)

前言: 前面两篇文章介绍了基于okHttp的post.get请求,以及文件的上传下载,今天主要介绍一下如何和Json解析一起使用?如何才能提高开发效率? 关于Json解析: 本文的Json解析采用阿里巴巴的FastJson 解析,也可以采用Gson解析,两者之间的对比请参考文章Android之json解析(FastJson Gson 对比)(http://www.cnblogs.com/whoislcj/p/5468420.html). 关于泛型: 本文将采用json统一泛型解析,阅读本文之前请

Django 10 模型层 model 元信息,对象优化查询,自定义group_concat,基于jq的ajex异步请求

Django model 元信息,对象优化查询,自定义group_concat,基于jq的ajex异步请求 Model类元信息 ORM对应的类里面包含另一个Meta类,而Meta类封装了一些数据库的信息.主要字段如下: da_table:ORM在数据库中的表名默认是 app_类名,可以通过db_table可以重写表名. index_together:联合索引 unique_together:联合唯一索引 ordering:指定默认按什么字段排序. 只有设置了该属性,我们查询到的结果才可以被rev

Android网络框架OkHttp之get请求(源码初识)

概括 OkHttp现在很火呀.于是上个星期就一直在学习OkHttp框架,虽然说起来已经有点晚上手了,貌似是2013年就推出了.但是现在它版本更加稳定了呀.这不,说着说着,OkHttp3.3版本在这几天又发布了.以下以OkHttp3.2版本为准,没办法,上个星期看的时候还是以3.2为最新版本的.首先,我们要先了解一些背景,OkHttp这个框架是有Square公司推出的,进入官网.如果想看API,点击进入API.大概了解了OkHttp之后,我们应该知道OkHttp是一个网络框架,想想以前在开发中,网

Android网络编程(七)源码解析OkHttp前篇[请求网络]

相关文章 Android网络编程(一)HTTP协议原理 Android网络编程(二)HttpClient与HttpURLConnection Android网络编程(三)Volley用法全解析 Android网络编程(四)从源码解析volley Android网络编程(五)OkHttp2.x用法全解析 Android网络编程(六)OkHttp3用法全解析 前言 学会了OkHttp3的用法后,我们当然有必要来了解下OkHttp3的源码,当然现在网上的文章很多,我仍旧希望我这一系列文章篇是最简洁易懂

实现基于Task的异步模式

返回该系列目录<基于Task的异步模式--全面介绍> 生成方法 编译器生成 在.NET Framework 4.5中,C#编译器实现了TAP.任何标有async关键字的方法都是异步方法,编译器会使用TAP执行必要的转换从而异步地实现方法.这样的方法应该返回Task或者Task<TResult>类型.在后者的案例中,方法体应该返回一个TResult,且编译器将确保通过返回的Task<TResult>是可利用的.相似地,方法体内未经处理的异常会被封送到输出的task,造成返