<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.ACCESS_WIFI_STATE"/>
四丶创建一个接口HttpListener
//function:关于自定义一个Nohttp请求网络的监听器,自己定义2个监听方法
一个是网络请求成功,一个是网络请求失败
public interface HttpListener<T> {
//请求成功时会掉的监听方法
void onSucceed(int what, Response response);
//请求网络失败回调的监听方法
void onFailed(int what, Response response);
}
五丶创建一个WaitDialog的类
/**
* 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);
//设置进度条显示的内容
setMessage("正在请求,请稍候");
}
public WaitDialog(Context context, int 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();
}
}
}
七丶
七丶创建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();
}
}
八丶主窗体代码(布局就是一个按钮,这里就不写了)
/**
* 使用自定义的网络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 request = NoHttp.createStringRequest(url, RequestMethod.GET);
//获取核心的Nohttp网络工具类对象
CallSever callSever = CallSever.getRequestInstance();
//把队列添加进去
callSever.add(this, 0, request, this, true, true);
break;
}
}
}