【www.shanpow.com--简历下载】
(1) [nohttp]NoHttp详解之NoHttp最基本使用(无封装)
目录(?)[+]
NoHttp详解之NoHttp最基本使用(无封装)
NoHttp是专门做Android网络请求与下载的框架,框架直播视频源码下载地址。
本文章demo下载
本文demo源码下载地址: http://download.csdn.net/detail/yanzhenjie1003/9433888
本文的例子来自上面的demo中的OriginalActivity中。
代码
对于新手, 看别人封装好的代码允许要稍微吃力一点,尤其是一个框架,所以我们先看NoHttp最原始的使用方法:
public class OriginalActivity extends BaseActivity implements View.OnClickListener {
/**
* 用来标志请求的what, 类似handler的what一样,这里用来区分请求
*/
private static final int NOHTTP_WHAT_TEST = 0x001;
/**
* 请求的时候等待框
*/
private WaitDialog mWaitDialog;
/**
* 请求队列
*/
private RequestQueue requestQueue;
@Override
protected void onActivityCreate(Bundle savedInstanceState) {
setTitle(Application.getInstance().nohttpTitleList[0]);
setContentView(R.layout.activity_original);
// 按钮点击监听
findView(R.id.btn_start).setOnClickListener(this);
mWaitDialog = new WaitDialog(this);
// 创建请求队列, 默认并发3个请求, 传入数字改变并发数量: NoHttp.newRequestQueue(1);
requestQueue = NoHttp.newRequestQueue();
}
@Override
public void onClick(View v) {
// 创建请求对象
Request<String> request = NoHttp.createStringRequest(url, RequestMethod.POST);
// 添加请求参数
request.add("userName", "yolanda");
request.add("userPass", 1);
request.add("userAge", 1.25);
// 上传文件
request.add("userHead", new FileBinary(new File(path)));
// 添加请求头
request.addHeader("Author", "nohttp_sample");
// 设置一个tag, 在请求完(失败/成功)时原封不动返回; 多数情况下不需要
// request.setTag(object);
/*
* what: 当多个请求同时使用同一个OnResponseListener时用来区分请求, 类似handler的what一样
* request: 请求对象
* onResponseListener 回调对象,接受请求结果
*/
requestQueue.add(NOHTTP_WHAT_TEST, request, onResponseListener);
}
/**
* 回调对象,接受请求结果
*/
private OnResponseListener<String> onResponseListener = new OnResponseListener<String>() {
@SuppressWarnings("unused")
@Override
public void onSucceed(int what, Response<String> response) {
if (what == NOHTTP_WHAT_TEST) {// 判断what是否是刚才指定的请求
// 请求成功
String result = response.get();// 响应结果
// 响应头
Headers headers = response.getHeaders();
headers.getResponseCode();// 响应码
response.getNetworkMillis();// 请求花费的时间
}
}
@Override
public void onStart(int what) {
// 请求开始,显示dialog
mWaitDialog.show();
}
@Override
public void onFinish(int what) {
// 请求结束,关闭dialog
mWaitDialog.dismiss();
}
@Override
public void onFailed(int what, String url, Object tag, CharSequence error, int resCode, long ms) {
// 请求失败
...
}
};
@Override
protected void onDestroy() {
super.onDestroy();
requestQueue.cancelAll();// 退出APP时停止所有请求
requestQueue.stop();// 退出APP时停止队列
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
(2) [nohttp]简单说说NoHTTP
简单说说NoHTTP
学习NoHttp的原因是由于公司之前做的产品使用的网络请求框架一直都是Volley(为什么使用Volley就不用多说了,最起码是谷歌开发团队自己搞的,总感觉权威一些),可是自从android6.0推出以后,Volley的使用开始有点动摇了。因为android6.0删除了HttpClient相关的API,我们知道的一般网络请求使用的API是HttpClient和URLConnection,而Volley就是基于HttpClient,虽然android2.3后2.3Volley可以解析URLConnection,但是部分解析URLConnection请求和响应还是用HttpClient的API。Google在android6.0删除HttpClient的缘由我们不去赘述,但是为此带来的问题就是可能在之后的版本中,volley的使用会存在一些问题,所以这个时候,公司觉得逐步用NoHttp(他是支持URLConnection的)取代Volley。
那么问题来了,volley和nohttp的异同有那些呢??下面我是从http://blog.csdn.net/yanzhenjie1003截的图,对比比较全面:
对比的东西就是上面那些,这里就不在一一分析了,接下来说的就是,如何使用nohttp:
1、导包,这里就不在多说了,在androidstudio里面可以直接导入的。
2、网络接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static String URL = "http://192.168.1.210:8080/Today/";
public static String SELECTMYCONTENT_URL=URL+"mycontent_select.php";
/**
* 查找我的内容
* @param mContext
* @param begin
* @param length
* @param key
* @param onResponseListener
*/
public static void getSelectMyContentResult(Context mContext,String begin,String length,int key,
OnResponseListener onResponseListener){
Request<JSONObject> request=NoHttp.createJsonObjectRequest(SELECTMYCONTENT_URL,RequestMethod.POST);
request.add("user_id",UserInfo.getUserId(mContext));
request.add("begin",begin);
request.add("length",length);
request.addHeader("Author", "nohttp_sample");
ServerApi.requestQueue.add(key, request, onResponseListener);
}
上面是我写的一个有关数据库查询的接口,里面的URL自定义,从服务器返回的数据是json格式的,向队列里添加的Request的参数是JSONObject。
下面就接口的调用,其实很简单,由于这个网络接口写在ServerApi中,且接口是静态方法,所以调用的时候直接使用“类名.方法”就可以直接调用了。
1
2
3
ServerApi.getSelectMyContentResult(MyContentActivity.this, String.valueOf(begin),
String.valueOf(length), NOHTTP_WHAT_TEST,
onResponseListener);
调用的时候传入相应的参数即可。
接下就是写个OnResponseListener,其实这是一个数据回调对象,用于接收网络请求返回结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private OnResponseListener<JSONObject> onResponseListenerAppData = new OnResponseListener<JSONObject>() {
@SuppressWarnings("unused")
@Override
public void onSucceed(int what, Response<JSONObject> response) {
if (what == NOHTTP_WHAT_TEST) {// 判断what是否是刚才指定的请求
// 请求成功
String result = response.get().toString();// 响应结果
Log.d("TAGTAG",result);
// 响应头
Headers headers = response.getHeaders();
headers.getResponseCode();// 响应码
response.getNetworkMillis();// 请求花费的时间
}
}
@Override
public void onFailed(int i, String s, Object o, Exception e, int i1, long l) {
Toast.makeText(MyContentActivity.this, "登录失败请重试", Toast.LENGTH_SHORT).show();
}
@Override
public void onStart(int what) {
// 请求开始,显示dialog
}
@Override
public void onFinish(int what) {
// 请求结束,关闭dialog
}
};
如上,在对调对象中,明确的声明了网络请求开始、结束、成功、失败相对应的方法,相应的操作写在方法中即可。
同时在上面的代码中有个常量:NOHTTP_WHAT_TEST。这个是自己定义的,用来标志请求的what, 类似handler的what一样,这里用来区分请求,这个自己定义。
上面就是个很简单的使用nohttp实现网络请求的例子,至于其他的应用,会在后续的博客中更新。
(3) [nohttp]NoHttp 与 OKHttp 异同?以及两者的发展前景?
NoHttp 与 OKHttp 异同?以及两者的发展前景?
添加评论
查看全部 12 个回答
Yolanda
10 人赞同
其实关于NoHttp和OkHttp很多贴在都讨论过了。NoHttp的源码在这里:GitHub - Y0LANDA/NoHttp: 支持HTTP/HTTPS, 自动维持Cookie, 异步/同步请求, 大文件/多文件上传, 文件下载; 支持304缓存, 302/303重定向, 支持代理服务器.二
者的区别如下:OkHttp、HttpURLConnection、HttpClient都是Java通用的,并且它们在做Socket相关的事。而
NoHttp、Volley、AsyncHttp是在前面三者的基础上做的封装,支持异步请求,是只有Android才可以用的(如果有人非说不是,那就
要修改不少源码在别的平台才能用)。而NoHttp同时支持异步和同步,大文件、多文件上传;Cookie的自动管理,实现了和浏览器一样的标准的
Cookie协议;还有Http缓存,比如304缓存,NoHttp还提供了几种缓存模式,比如1 缓存使用缓存没缓存才请求网络,2
有网络请求网络没有网络就使用缓存,3 仅仅使用网络,4
仅仅使用缓存等等。支持队列,支持和Activity、Fragment声明周期联动取消请求,支持请求String、Bitmap、Json、
JavaBean,可自定义扩展请求类型。至于发展前景很明了了,NoHttp专门来做网络请求,不绑架开发者。NoHttp的Jar只有
130k左右,没有使用第三方依赖,纯Android原生实现。NoHttp的底层默认使用的URLConnection,但是Android4.4之后
系统不是内置了OkHttp吗?然后看源码后发现4.4以后的URLConnection使用OkHttp的接口去实现的,所以NoHttp想当然的就是
很不错的选择。OkHttp还用说吗?大牛团队square出品,值得信赖。

