NoHttp的封装

零丶关于Nohttp的基本使用请见
大神严振杰的博客: http://blog.csdn.net/yanzhenjie1003


废话不多说,直接进入程序

代码结构
NoHttp的封装_第1张图片
实现效果
NoHttp的封装_第2张图片



实现步骤
一丶由于无法直接关联nohttp,所以采用此方法来关联
NoHttp的封装_第3张图片
打出红色划线部分,然后选中右上角,即可导入Nohttp
二丶创建一个MyApplication的类
//自定义的Application做的任何初始化,对整个程序都有效
public classMyApplication extends Application {
   
@Override
   
public voidonCreate() {
       
//noHttp初始化
       
NoHttp.initialize(this);
       
super.onCreate();
    }
}
完成后在清单文件添加便可使用Nohttp
NoHttp的封装_第4张图片
三丶清单文件添加权限
<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);
        //设置当前的ActivityTitle,并且全屏(点用这个方法必须在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<Timplements OnResponseListener {
    //使用之前自定义的进度条对话框
    private WaitDialog mWaitDialog;
    //之前定义的监听方法的接口类
    private HttpListener<Tcallback;
    //一个标识,看是否加载
    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 < Tvoid 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(this0, request, thistruetrue);
                break;
        }
    }
}













你可能感兴趣的:(Nohttp)