零丶关于Nohttp的基本使用请见
大神严振杰的博客: http://blog.youkuaiyun.com/yanzhenjie1003
废话不多说,直接进入程序
代码结构
实现效果
实现步骤
一丶由于无法直接关联nohttp,所以采用此方法来关联
打出红色划线部分,然后选中右上角,即可导入Nohttp
二丶创建一个MyApplication的类
//自定义的Application做的任何初始化,对整个程序都有效
public classMyApplication extends Application {
@Override
public voidonCreate() {
//noHttp初始化
NoHttp.initialize(this);
super.onCreate();
}

@Override
public voidonCreate() {
//noHttp初始化
NoHttp.initialize(this);
super.onCreate();
}
}
完成后在清单文件添加便可使用Nohttp
三丶清单文件添加权限
<uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permissionandroid:name="android.permission.INTERNET"/>
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permissionandroid:name="android.permission.INTERNET"/>
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
四丶创建一个接口HttpListener
//function:关于自定义一个Nohttp请求网络的监听器,自己定义2个监听方法
一个是网络请求成功,一个是网络请求失败
public interface HttpListener<T> {
//请求成功时会掉的监听方法
void onSucceed(int what, Response<String> response);
//请求网络失败回调的监听方法
//请求成功时会掉的监听方法
void onSucceed(int what, Response<String> response);
//请求网络失败回调的监听方法
void onFailed(int what, Response<String> response);
}
五丶创建一个WaitDialog的类
/**
* date:2016/12/14
* author:耿佳伟
* function:自定义一个进度条对话框
*/
* date:2016/12/14
* author:耿佳伟
* function:自定义一个进度条对话框
*/
public class WaitDialog extends ProgressDialog {
public WaitDialog(Context context) {
super(context);
//设置当前的Activity无Title,并且全屏(点用这个方法必须在setContentView之前)
requestWindowFeature(Window.FEATURE_NO_TITLE);
//设置对话框的外面点击,是否让对话框消失,false是可以取消
setCanceledOnTouchOutside(false);
//设置对话框的样式
setProgressStyle(STYLE_SPINNER);
//设置进度条显示的内容
super(context);
//设置当前的Activity无Title,并且全屏(点用这个方法必须在setContentView之前)
requestWindowFeature(Window.FEATURE_NO_TITLE);
//设置对话框的外面点击,是否让对话框消失,false是可以取消
setCanceledOnTouchOutside(false);
//设置对话框的样式
setProgressStyle(STYLE_SPINNER);
//设置进度条显示的内容
setMessage("正在请求,请稍候");
}
public WaitDialog(Context context, int theme) {
super(context, theme);
super(context, theme);
}
}
六丶创建HttpResponseListener类
/**
* date:2016/12/14
* author:耿佳伟
* function:自定义一个Nohttp对于请求网络的监听器,使用这个自定义监听会带一个进度条
*/
public class HttpResponseListener<T> implements OnResponseListener {
//使用之前自定义的进度条对话框
private WaitDialog mWaitDialog;
//之前定义的监听方法的接口类
private HttpListener<T> callback;
//一个标识,看是否加载
private boolean isLoading;
//一个NoHttp队列
private Request<?> mRequest;
//上下文
private Context context;
//一个标识,判断进度条对话框是否可以取消
private boolean canCancle;
/**
* @param callback 自定义的接口对象,就是复写Nohttp成功失败的那个类
* @param isLoading 判断进度条对话框是否可以取消
* @param request Nohttp的队列对象
* @param context 上下文
* @param canCancle
*/
public HttpResponseListener(Context context, Request<?> request, HttpListener<T> callback, boolean isLoading, boolean canCancle) {
this.callback = callback;
this.isLoading = isLoading;
mRequest = request;
this.context = context;
this.canCancle = canCancle;
if (context != null && isLoading) {
mWaitDialog = new WaitDialog(context);
mWaitDialog.setCancelable(canCancle);
//设置监听器
//当对话框点击外面可以取消,那么就让他取消的逻辑代码
mWaitDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
HttpResponseListener.this.mRequest.cancel();
}
});
}
}
//请求网络开始时回调,进度条对话框的显示
@Override
public void onStart(int what) {
//判断进度条对话框是否处于夹在状态,进度条对话框对象是否存在,进度条对话框是否存在
if (isLoading && mWaitDialog != null && !mWaitDialog.isShowing()) {
//显示对话框
mWaitDialog.show();
}
}
//网络请求成功时回调,代码直接运行在主线程
@Override
public void onSucceed(int what, Response response) {
//使用的是自己定义的接口,先判断接口对象是否为Null,不为Null时执行
if (callback != null) {
callback.onSucceed(what, response);
}
}
//网络请求失败时回调,代码直接运行在主线程
@Override
public void onFailed(int what, Response response) {
//使用的是自己定义的接口,先判断接口对象是否为Null,为Null时执行
if (callback != null) {
callback.onFailed(what, response);
}
}
//请求结束时进度条对话框隐藏
@Override
public void onFinish(int what) {
//判断进度条对话框是否处于夹在状态,进度条对话框对象是否存在,进度条对话框是否存在
if (isLoading && mWaitDialog != null && mWaitDialog.isShowing()) {
//隐藏对话框
mWaitDialog.dismiss();
}
}
* date:2016/12/14
* author:耿佳伟
* function:自定义一个Nohttp对于请求网络的监听器,使用这个自定义监听会带一个进度条
*/
public class HttpResponseListener<T> implements OnResponseListener {
//使用之前自定义的进度条对话框
private WaitDialog mWaitDialog;
//之前定义的监听方法的接口类
private HttpListener<T> callback;
//一个标识,看是否加载
private boolean isLoading;
//一个NoHttp队列
private Request<?> mRequest;
//上下文
private Context context;
//一个标识,判断进度条对话框是否可以取消
private boolean canCancle;
/**
* @param callback 自定义的接口对象,就是复写Nohttp成功失败的那个类
* @param isLoading 判断进度条对话框是否可以取消
* @param request Nohttp的队列对象
* @param context 上下文
* @param canCancle
*/
public HttpResponseListener(Context context, Request<?> request, HttpListener<T> callback, boolean isLoading, boolean canCancle) {
this.callback = callback;
this.isLoading = isLoading;
mRequest = request;
this.context = context;
this.canCancle = canCancle;
if (context != null && isLoading) {
mWaitDialog = new WaitDialog(context);
mWaitDialog.setCancelable(canCancle);
//设置监听器
//当对话框点击外面可以取消,那么就让他取消的逻辑代码
mWaitDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
HttpResponseListener.this.mRequest.cancel();
}
});
}
}
//请求网络开始时回调,进度条对话框的显示
@Override
public void onStart(int what) {
//判断进度条对话框是否处于夹在状态,进度条对话框对象是否存在,进度条对话框是否存在
if (isLoading && mWaitDialog != null && !mWaitDialog.isShowing()) {
//显示对话框
mWaitDialog.show();
}
}
//网络请求成功时回调,代码直接运行在主线程
@Override
public void onSucceed(int what, Response response) {
//使用的是自己定义的接口,先判断接口对象是否为Null,不为Null时执行
if (callback != null) {
callback.onSucceed(what, response);
}
}
//网络请求失败时回调,代码直接运行在主线程
@Override
public void onFailed(int what, Response response) {
//使用的是自己定义的接口,先判断接口对象是否为Null,为Null时执行
if (callback != null) {
callback.onFailed(what, response);
}
}
//请求结束时进度条对话框隐藏
@Override
public void onFinish(int what) {
//判断进度条对话框是否处于夹在状态,进度条对话框对象是否存在,进度条对话框是否存在
if (isLoading && mWaitDialog != null && mWaitDialog.isShowing()) {
//隐藏对话框
mWaitDialog.dismiss();
}
}
}
七丶
七丶创建CallSever类
/**
* date:2016/12/14
* author: 耿佳伟
* function: 使用 studio 可以自动生成一单例模式的类 , 该类不能 new, 只能通过 get 获取
*/
public class CallSever {
private static CallSever sCallSever;
/**
* 通过雷鸣调用 , 获取 CallServer 对象
*/
public synchronized static CallSever getRequestInstance() {
if ( sCallSever == null) {
sCallSever = new CallSever();
}
return sCallSever;
}
/**
* 创建一个 Nohttp 请求队列的对象
*/
private RequestQueue mRequestQueue;
private CallSever() {
mRequestQueue = NoHttp. newRequestQueue();
}
/**
* @param context 上下文 用来实例化我们自定义的对话框
* @param what 标识 , 用来标志请求 , 当多个请求使用同一个
* @param callback 网络请求的监听器
* @param canCancle 是否允许用户取消请求
* @param isLoading 是否显示进度条对话框
* @param request 请求对象
*/
public < T> void add(Context context, int what, Request< T> request, HttpListener< T> callback, boolean canCancle, boolean isLoading) {
mRequestQueue.add(what, request, new HttpResponseListener< T>(context, request, callback, canCancle, isLoading));
}
/**
* 取消这个 sign 标记的所有请求
*/
public void cancelBySign(Object sign) {
mRequestQueue.cancelBySign(sign);
}
/**
* 取消队列中所有请求
*/
public void cancelAll() {
mRequestQueue.cancelAll();
}
/**
* 退出 app 时停止所有请求
*/
public void stopAll() {
mRequestQueue.stop();
}
}
* date:2016/12/14
* author: 耿佳伟
* function: 使用 studio 可以自动生成一单例模式的类 , 该类不能 new, 只能通过 get 获取
*/
public class CallSever {
private static CallSever sCallSever;
/**
* 通过雷鸣调用 , 获取 CallServer 对象
*/
public synchronized static CallSever getRequestInstance() {
if ( sCallSever == null) {
sCallSever = new CallSever();
}
return sCallSever;
}
/**
* 创建一个 Nohttp 请求队列的对象
*/
private RequestQueue mRequestQueue;
private CallSever() {
mRequestQueue = NoHttp. newRequestQueue();
}
/**
* @param context 上下文 用来实例化我们自定义的对话框
* @param what 标识 , 用来标志请求 , 当多个请求使用同一个
* @param callback 网络请求的监听器
* @param canCancle 是否允许用户取消请求
* @param isLoading 是否显示进度条对话框
* @param request 请求对象
*/
public < T> void add(Context context, int what, Request< T> request, HttpListener< T> callback, boolean canCancle, boolean isLoading) {
mRequestQueue.add(what, request, new HttpResponseListener< T>(context, request, callback, canCancle, isLoading));
}
/**
* 取消这个 sign 标记的所有请求
*/
public void cancelBySign(Object sign) {
mRequestQueue.cancelBySign(sign);
}
/**
* 取消队列中所有请求
*/
public void cancelAll() {
mRequestQueue.cancelAll();
}
/**
* 退出 app 时停止所有请求
*/
public void stopAll() {
mRequestQueue.stop();
}
}
八丶主窗体代码(布局就是一个按钮,这里就不写了)
/**
* 使用自定义的网络NOhttp工具类步骤:
* 1. 关联NOhttp,配置NOhttp初始,添加权限.
* 2. 设置访问网络url
* 3. 使用NOhttp创建队列
* 4. 调用核心的NOhttp网络工具类CallServer,获取对象
* 5. 把队列添加进行,再设置对对话框操作的参数
* 6. Activity实现HttpListener接口,覆写我们自定义的构造方法,覆写请求网络成功和失败的构造方法
*/
public class MainActivity extends AppCompatActivity implements HttpListener, View.OnClickListener {
private Button btn_get;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
//访问网络成功,执行在主线程的代码
@Override
public void onSucceed(int what, Response response) {
switch (what) {
case 0:
Toast.makeText(MainActivity.this, "" + response.get(), Toast.LENGTH_SHORT).show();
}
}
//访问网络失败,执行在主线程的代码
@Override
public void onFailed(int what, Response response) {
}
private void initView() {
btn_get = (Button) findViewById(R.id.btn_get);
btn_get.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
//根据点击事件使用Nohttp执行网络请求
case R.id.btn_get:
String url = "http://www.baidu.com";
//创建请求对象,设置加载的网络路径和请求
Request<String> request = NoHttp.createStringRequest(url, RequestMethod.GET);
//获取核心的Nohttp网络工具类对象
CallSever callSever = CallSever.getRequestInstance();
//把队列添加进去
callSever.add(this, 0, request, this, true, true);
break;
}
}
}
* 使用自定义的网络NOhttp工具类步骤:
* 1. 关联NOhttp,配置NOhttp初始,添加权限.
* 2. 设置访问网络url
* 3. 使用NOhttp创建队列
* 4. 调用核心的NOhttp网络工具类CallServer,获取对象
* 5. 把队列添加进行,再设置对对话框操作的参数
* 6. Activity实现HttpListener接口,覆写我们自定义的构造方法,覆写请求网络成功和失败的构造方法
*/
public class MainActivity extends AppCompatActivity implements HttpListener, View.OnClickListener {
private Button btn_get;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
//访问网络成功,执行在主线程的代码
@Override
public void onSucceed(int what, Response response) {
switch (what) {
case 0:
Toast.makeText(MainActivity.this, "" + response.get(), Toast.LENGTH_SHORT).show();
}
}
//访问网络失败,执行在主线程的代码
@Override
public void onFailed(int what, Response response) {
}
private void initView() {
btn_get = (Button) findViewById(R.id.btn_get);
btn_get.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
//根据点击事件使用Nohttp执行网络请求
case R.id.btn_get:
String url = "http://www.baidu.com";
//创建请求对象,设置加载的网络路径和请求
Request<String> request = NoHttp.createStringRequest(url, RequestMethod.GET);
//获取核心的Nohttp网络工具类对象
CallSever callSever = CallSever.getRequestInstance();
//把队列添加进去
callSever.add(this, 0, request, this, true, true);
break;
}
}
}