NoHttp的封装

实现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);
    }

}
效果图:



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值