参考博客: 点击打开链接
NoHttp详细文档:http://doc.nohttp.net
NoHttp公益测试接口:http://api.nohttp.net
https://github.com/yanzhenjie/NoHttp
支持与Rxjava完美结合、支持一句话切换底层为OkHttp,支持缓存数据到数据库或SD卡和数据库,并对数据做了加密保护,支持请求Restful风格的接口,比Retrofit更简单易用。compile 'com.yolanda.nohttp:nohttp:1.1.0'如果要使用OkHttp作为网络层,请再依赖:compile 'com.yanzhenjie.nohttp:okhttp:1.1.0'初始化
NoHttp初始化需要一个Context,最好在application的onCreate()中初始化,记得在manifest.xml中注册Application。
一般初始化
直接初始化后,一切采用默认设置。
NoHttp.initialize(this);public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); //NoHttp初始化 NoHttp.initialize(this); }}get和post请求原生使用:
public class MainActivity extends AppCompatActivity { PRivate TextView mTv; /*** * 1.如果是mac,可以安装jsonOnlineView * 2.如果是windows,postman,google的浏览器Chrome的插件 */ private String postUrl = "https://api.bmob.cn/1/users"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTv = (TextView) findViewById(R.id.tv); } /*** * Nohttp的get方式 * @param view */ public void btn_get(View view){ /**可以封装到其他的地方*/ String url = "http://www.baidu.com"; //1.创建一个队列 /**也可以封装,只需要一个队列就够了**/ RequestQueue queue = NoHttp.newRequestQueue(); //3.创建消息请求 Request<String> request = NoHttp.createStringRequest(url, RequestMethod.GET); //2.利用队列去添加消息请求 /*** * what:请求的标识 * request:请求 * response:请求的回调监听 */ /**请求可以并发,统一处理响应结果**/ queue.add(0, request, new OnResponseListener<String>() { //请求一开始的回调,对话框的加载 @Override public void onStart(int what) { } //成功之后的回调 @Override public void onSucceed(int what, Response<String> response) { //设置响应结果 mTv.setText(response.get()); } //网络请求失败的回调 @Override public void onFailed(int what, String url, Object tag, Exception exception, int responseCode, long networkMillis) { } //网络请求完成 @Override public void onFinish(int what) { } }); } public void btn_post(View view){ RequestQueue queue = NoHttp.newRequestQueue(); Request<String> request = NoHttp.createStringRequest(postUrl, RequestMethod.POST); request.addHeader("X-Bmob-REST-API-Key","2bfebfad889df974a01ab7867d411f75"); request.addHeader("X-Bmob-Application-Id","cae7c5400719de3e04d708f5c82d94e8"); request.addHeader("Content-Type","application/json"); request.setDefineRequestBodyForJson("{/"username/" : /"1234567890/",/"passWord/" : /"654321/"}");// request.add("username","123456");// request.add("password","123456"); queue.add(1, request, new OnResponseListener<String>() { @Override public void onStart(int what) { } @Override public void onSucceed(int what, Response<String> response) { mTv.setText(response.get()); } @Override public void onFailed(int what, String url, Object tag, Exception exception, int responseCode, long networkMillis) { } @Override public void onFinish(int what) { } }); }}基本使用:
特别注意:这里的RequestQueue是请求队列,默认3个并发请求,也就是有3个子线程在跑,所以正式项目中不要每发起一个请求就new一个队列,建议在BaseActivity#onCreate(Bundle)中new一个队列即可,这个activity的所有请求包括依赖此activity的fragment都是用这个队列即可,在BaseActivity#onDestory()时stop这个队列即可,当然特殊情况下可以再new一个Queue出来,也无伤大雅的。
建议读者阅读完下方的代码后再把上面这句话读一遍,会理解的更深刻。
BaseActivity,提供基础的封装
public class BaseActivtiy extends Activity implements View.OnClickListener { /** * 请求队列 */ private RequestQueue mRequestQueue; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 创建请求队列, 默认并发3个请求, 传入数字改变并发数量: NoHttp.newRequestQueue(5); mRequestQueue = NoHttp.newRequestQueue(); } @Override protected void onDestroy() { super.onDestroy(); mRequestQueue.cancelAll(); // 退出页面时时取消所有请求。 mRequestQueue.stop(); // 退出时销毁队列,回收资源。 } /** * 发起一个请求。 * * @param what what. * @param request 请求对象。 * @param listener 结果监听。 * @param <T> 要请求到的数据类型。 */ public <T> void request(int what, Request<T> request, OnResponseListener<T> listener) { mRequestQueue.add(what, request, listener); }}在BaseActivity的子类中使用
public class MainActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... } /** * 请求用户信息。 */ private void requestUserInfo() { Request<String> req = NoHttp.createStringRequest(url); request(0, req, new OnResponseListener<String>() { @Override public void onStart(int what) { // 请求开始,可以显示一个dialog。 } @Override public void onSucceed(int what, Response<String> response) { // 请求成功,这里判断服务器的响应码,假如你们服务器200时,才是业务成功: Headers headers = response.getHeaders(); if(headers.getResponseCode() == 200) { String result = response.get(); // 拿到结果。 } } @Override public void onFailed(int what, Response<String> response) { // 请求失败,具体失败类型,请看nohttp主页的demo。 } @Override public void onFinish(int what) { // 请求结束,关闭dialog。 } }); }}在BaseActivity的子类的Fragment中使用
public class MainFragment extends Fragment { /** * 请求用户信息。 */ private void requestUserInfo() { Request<String> req = NoHttp.createStringRequest(url); ((MainActivity)getActivity()).request(0, req, new OnResponseListener<String>() { @Override public void onStart(int what) { // 请求开始,可以显示一个dialog。 } @Override public void onSucceed(int what, Response<String> response) { // 请求成功,这里判断服务器的响应码,假如你们服务器200时,才是业务成功: Headers headers = response.getHeaders(); if(headers.getResponseCode() == 200) { String result = response.get(); // 拿到结果。 } } @Override public void onFailed(int what, Response<String> response) { // 请求失败,具体失败类型,请看nohttp主页的demo。 } @Override public void onFinish(int what) { // 请求结束,关闭dialog。 } }); }}下一篇,nohttp的封装版。
如果想学习更多的使用方法,建议参考Demo:https://github.com/yanzhenjie/NoHttp 更多使用介绍请阅读NoHttp文档:doc.nohttp.net
新闻热点
疑难解答