实现NoHttp的封装
关于NoHttp的依赖和初始化请看http://blog.csdn.net/hatsune39/article/details/53609601
1.自定义一个进度条对话框新建一个类继承ProgressDialog,并实现两个方法.
public class WaitDialog extends ProgressDialog {
public WaitDialog(Context context) {
super(context);
//设置当前的Activity无Tilte,并且全屏(调用这个方法必须在setContentView之前调用)
requestWindowFeature(Window.FEATURE_NO_TITLE);
//设置在对话框的外面点击,是否让对话框消失,false是可以取消
setCanceledOnTouchOutside(false);
//设置对话框的样式
setProgressStyle(STYLE_SPINNER);
//设置进度条对话框显示的内容
setMessage("正在请求网络,请稍后....");
}
public WaitDialog(Context context, int theme) {
super(context, theme);
}
}
2.
自定义一个接口,NoHttp请求网络的监听器,自己定义两个监听方法,网络请求成功,网络请求失败
public interface HttpListener<T> {
//请求网络成功回调的方法
void onSucceed(int what, Response<String> response);
//请求网络失败回调的监听方法
void onFailed(int what, Response<String> response);
}
3.
自定义一个NoHttp对于请求网络的监听器,使用这个自定义监听请求网络会带一个对话框进度条
public class HttpResponseListener<T> implements OnResponseListener {
//使用自定义的一个进度条对话框
private WaitDialog waitDialog;
//使用自定义的监听方法的接口类
private HttpListener<T> callback;
//定义一个标识,看是否在加载
private boolean isLoading;
//一个NoHttp队列
private Request<?> request;
/**
* @param context 上下文
* @param request NoHttp的队列对象
* @param canCancle 判断进度条对话框是否可以取消
* @param callback 我们自定义的一个接口对象,就是那个复写NoHttp成功失败的类
* @param isLoading 判断进度条对话框是否正在加载状态
*/
public HttpResponseListener(Context context, Request<?> request, HttpListener<T> callback, boolean canCancle, boolean isLoading) {
this.callback = callback;
this.request = request;
this.isLoading = isLoading;
//对上下文进行非空判断及判断进度条对话框是否显示
if (context != null && isLoading) {
waitDialog = new WaitDialog(context);
waitDialog.setCancelable(canCancle);
//当对话框点击外面可以取消,那么就让它取消掉逻辑代码
waitDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialogInterface) {
HttpResponseListener.this.request.cancel();
}
});
}
}
//请求开始时回调,进度条对话框显示
@Override
public void onStart(int what) {
//判断进度条对话框是否处于加载状态,进度条对话框对象是否存在,进度条对话框是否显示
if (isLoading && waitDialog != null && !waitDialog.isShowing()) {
waitDialog.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) {
if (callback!=null){
callback.onFailed(what,response);
}
}
//请求网络结束时回调,进度条对话框隐藏
@Override
public void onFinish(int what) {
if (isLoading && waitDialog != null && waitDialog.isShowing()) {
waitDialog.dismiss();
}
}
}
4.
使用
studio
可以自动生成一个单例模式的类
public class CallServer {
private static CallServer callServer;
/**
* 通过类名调用,获取CallServer对象
*/
public synchronized static CallServer getRequestInstance() {
if (callServer == null) {
callServer = new CallServer();
}
return callServer;
}
/**
* 创建一个NoHttp请求队列的对象
*/
private RequestQueue requestQueue;
private CallServer() {
requestQueue = NoHttp.newRequestQueue();
}
//添加一个请求到请求队列
/**
*
* @param context 上下文,用来实例化自定义的对话框
* @param what 标识,用来标志请求,当多个请求使用同一个时,在回调方法中
* @param callback 网络请求的监听器
* @param request 请求对象
* @param canCancle 是否允许用户请求取消
* @param isLoading 是否显示进度条对话框
* @param <T>
*/
public <T> void add(Context context, int what, Request<T> request,HttpListener<T> callback, boolean canCancle, boolean isLoading){
requestQueue.add(what,request,new HttpResponseListener<T>(context,request,callback,canCancle,isLoading));
}
}
4.使用封装好的NoHttp,要链接已经写好的HttpListener接口
public class MainActivity extends AppCompatActivity implements HttpListener, View.OnClickListener {
private Button btnOK;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnOK:
String url = "http://www.baidu.com";
//创建NoHttp的请求对象,设置加载的网络路径和请求
Request<String> request = NoHttp.createStringRequest(url, RequestMethod.GET);
//获取核心的NoHttp网络工具类对象
CallServer callServerInstance = CallServer.getRequestInstance();
//把队列添加进去
callServerInstance.add(MainActivity.this,0,request,this,true,true);
break;
}
}
@Override
public void onSucceed(int what, Response response) {
switch (what){
case 0:
// String s = (String) response.get();
Toast.makeText(MainActivity.this,""+response.get(), Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
@Override
public void onFailed(int what, Response response) {
}
private void initView() {
btnOK = (Button) findViewById(R.id.btnOK);
btnOK.setOnClickListener(this);
}
}
效果图: