安卓OkHttp项目级别使用

该博客详细介绍了如何在安卓项目中使用OkHttp进行网络请求,包括底层的监听方法、请求方法的抽象实现、数据传输封装、Activity中如何调用请求任务以及对网络请求的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 底层Okhttp请求方法Listener
public class OkhttpListener<T> {
    public static Handler mMainHandler = new Handler(Looper.getMainLooper());
    private Type mType;
    private AsyncTaskListener<T> mListener;
    
    public OkhttpListener(Type type, AsyncTaskListener<T> listener) {
        this.mListener = listener;
        this.mType = type;
        mListener.onStart();
    }
    public void onProgress(float progress, long total) {
    }
    public void onError(final Call call, final Exception e) {

        mMainHandler.post(new Runnable() {
            @Override
            public void run() 
                Log.e("Okhttp onError--->", "error");
                mListener.onFinish();
                e.printStackTrace();
            }
        });
    }
    public void onSeccess(Call call, final Response response) {
        //final T obj = onParseResponse(call, response);
        String json = "";
        try {
            json = response.body().string();
            Log.e("okhttp  ", "   " + response.code() + json.toString());

            if (response.code() == 200) {
                final T bean;
                try {
                    bean = GsonUtils.getInstance().fromJson(json, mType);

                    mMainHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            mListener.onSuccess(bean);
                            // Log.e("Okhttp  ---->", json);
                            mListener.onFinish();
                        }
                    });
                } catch (Exception e) {
                    Log.e("Okhttp  ---->", "解析异常");
                    mListener.onFailure(new FailureBean(FailureBean.ERROR_PARSE, "数据解析异常"));
                }
            } else {
                try {
                    final FailureBean bean = GsonUtils.getInstance().fromJson(json, FailureBean.class);
                    mMainHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            mListener.onFailure(bean);
                            mListener.onFinish();
                        }
                    });
                    Log.e("Okhttp  ---->Error", "      " + response.code() + "  msg" + response.message());
                } catch (final Exception e) {
                    mMainHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            mListener.onFailure(new FailureBean(FailureBean.ERROR_PARSE, "数据获取失败"));
                            e.printStackTrace();
                        }
                    });
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        response.close(); //无论任何情况都要关闭该对象
    }
}
  • Okhttps请求方法抽象类实现
public abstract class AsyncTaskListener<T> {
    public void onStart() {
    }

    public abstract void onSuccess(T bean);

    public void onFailure(FailureBean bean) {

        try {
            if (System.currentTimeMillis() - MyApplication.HTTPfailTime > 10000) {
                MyApplication.HTTPfailTime = System.currentTimeMillis();
                if (APIConstant.FAIL_CODE_RELODE == bean.getCode()) {
//                    if (UserManager.getInstance().hasLoginUser() != null) {
                    if (MyApplication.mApplication.getCurContext() != null) {
                        //UserManager.getInstance().logout();
                        Intent intent = new Intent(MyApplication.mApplication.getCurContext(), LoginActivity.class);
                        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
                        MyApplication.mApplication.getCurContext().startActivity(intent);
                    }
                }
//                }
            }
        } catch (Exception e) {
        }
    }

    public void onFinish() {
    }
}

  • okhttps请求方式以及数据传输方式封装
public class OkhttpUtil {

    public static final String METHOD_GET = "GET";
    public static final String METHOD_POST = "POST";
    public static final String METHOD_PUT = "PUT";
    public static final String METHOD_DELETE = "DELETE";

    /**
     * get要求
     *
     * @param url:url
     * @param okhttpListener:回调接口,onFailure方法在要求失败时调用,onResponse方法在要求成功后调用,这两个方法都执行在UI线程。
     */
    public static void okHttpGet(String url, OkhttpListener okhttpListener) {
        okHttpGet(url, null, null, okhttpListener);
    }

    /**
     * get要求,可以传递参数
     *
     * @param url:url
     * @param paramsMap:map集合,封装键值对参数
     * @param okhttpListener
     */
    public static void okHttpGet(String url, Map<String, Object> paramsMap, OkhttpListener okhttpListener) {
        okHttpGet(url, paramsMap, null, okhttpListener);
    }

    /**
     * get要求,可以传递参数
     *
     * @param url:url
     * @param paramsMap:map集合,封装键值对参数
     * @param headerMap:map集合,封装要求头键值对
     * @param okhttpListener
     */
    public static void okHttpGet(String url, Map<String, Object> paramsMap, Map<String, Object> headerMap, OkhttpListener okhttpListener) {
        new RequestUtil(METHOD_GET, url, paramsMap, headerMap, okhttpListener).enqueue();
    }

    /**
     * post要求
     *
     * @param url:url
     * @param okhttpListener
     */
    public static void okHttpPost(String url, OkhttpListener okhttpListener) {
        okHttpPost(url, null, okhttpListener);
    }

    /**
     * post要求,可以传递参数
     *
     * @param url:url
     * @param paramsMap
     * @param okhttpListener
     */
    public static void okHttpPost(String url, Map<String, Object> paramsMap, OkhttpListener okhttpListener) {
        okHttpPost(url, paramsMap, null, okhttpListener);
    }

    /**
     * post要求,可以传递参数
     *
     * @param url:url
     * @param paramsMap:map集合,封装键值对参数
     * @param headerMap:map集合,封装要求头键值对
     * @param okhttpListener
     */
    public static void okHttpPost(String url, Map<String, Object> paramsMap, Map<String, Object> headerMap, OkhttpListener okhttpListener) {
        new RequestUtil(METHOD_POST, url, paramsMap, headerMap, okhttpListener).enqueue();
    }

    /**
     * Put要求
     *
     * @param url:url
     * @param callBack
     */
    public static void okHttpPut(String url, OkhttpListener callBack) {
        okHttpPut(url, null, callBack);
    }

    /**
     * Put要求,可以传递参数
     *
     * @param url:url
     * @param paramsMap:map集合,封装键值对参数
     * @param okhttpListener
     */
    public static void okHttpPut(String url, Map<String, Object> paramsMap, OkhttpListener okhttpListener) {
        okHttpPut(url, paramsMap, null, okhttpListener);
    }

    /**
     * Put要求,可以传递参数
     *
     * @param url:url
     * @param paramsMap:map集合,封装键值对参数
     * @param headerMap:map集合,封装要求头键值对
     * @param okhttpListener
     */
    public static void okHttpPut(String url, Map<String, Object> paramsMap, Map<String, Object> headerMap, OkhttpListener okhttpListener) {
        new RequestUtil(METHOD_PUT, url, paramsMap, headerMap, okhttpListener).enqueue();
    }

    /**
     * Delete
     *
     * @param url:url
     * @param okhttpListener
     */
    public static void okHttpDelete(String url, OkhttpListener okhttpListener) {
        okHttpDelete(url, null, okhttpListener);
    }

    /**
     * Delete
     *
     * @param url:url
     * @param paramsMap:map集合,封装键值对参数
     * @param okhttpListener
     */
    public static void okHttpDelete(String url, Map<String, Object> paramsMap, OkhttpListener okhttpListener) {
        okHttpDelete(url, paramsMap, null, okhttpListener);
    }

    /**
     * Delete
     *
     * @param url:url
     * @param paramsMap:map集合,封装键值对参数
     * @param headerMap:map集合,封装要求头键值对
     * @param okhttpListener
     */
    public static void okHttpDelete(String url, Map<String, Object> paramsMap, Map<String, Object> headerMap, OkhttpListener okhttpListener) {
        new RequestUtil(METHOD_DELETE, url, paramsMap, headerMap, okhttpListener).enqueue();
    }

    /**
     * post要求,json传参方式
     *
     * @param url:url
     * @param jsonStr:json格式的键值对参数
     * @param okhttpListener
     */
    public static void okHttpPostJson(String url, String jsonStr, OkhttpListener okhttpListener) {
        okHttpPostJson(url, jsonStr, null, okhttpListener);
    }

    /**
     * post要求,json传参方式
     *
     * @param url:url
     * @param jsonStr:json格式的键值对参数
     * @param headerMap:map集合,封装要求头键值对
     * @param okhttpListener
     */
    public static void okHttpPostJson(String url, String jsonStr, Map<String, Object> headerMap, OkhttpListener okhttpListener) {
        new RequestUtil(METHOD_POST, url, jsonStr, headerMap, okhttpListener).enqueue();
    }

    /**
     * 判断网络是否连接
     *
     * @param context
     * @return
     */
    public static boolean isConnected(Context context) {

        ConnectivityManager connectivity = (ConnectivityManager) context
                .getSystemService(Context.CONNECTIVITY_SERVICE);

        if (null != connectivity) {

            NetworkInfo info = connectivity.getActiveNetworkInfo();
            if (null != info && info.isConnected()) {
                if (info.getState() == NetworkInfo.State.CONNECTED) {
                    return true;
                }
            }
        }
        return false;
    }
}

  • 数据处理及调用请求方式
 public void loginPassword(String loginId, String password, String enterpriseId, final AsyncTaskListener<ParentUserBean> listener) {
        Map map = new HashMap();
        map.put(APIConstant.LOGIN_BASIC_LOGIN_ID, loginId);
        map.put(APIConstant.REQUEST_PARAM_PASSWORD, password);
        map.put(APIConstant.LOGIN_BASIC_ENTERPRISE_ID, enterpriseId);
        OkhttpUtil.okHttpGet(APIConstant.LOGIN, map, new OkhttpListener(ParentUserBean.class, listener));
    }
  • Activity重写抽象方法,并调用对应的TASK
 new AccountNewTask().loginPassword(loginID, password, companyCode, new AsyncTaskListener<ParentUserBean>() {
            @Override
            public void onStart() {
                super.onStart();
                progressDialog.setMessage(getString(R.string.login_load));
                progressDialog.show();
                progressDialog.setCanceledOnTouchOutside(false);
            }

            @Override
            public void onSuccess(ParentUserBean bean) {
          
                if ("200".equals(bean.getStatusCode())) {
                    saveCompanyCode(bean);
                    finishActivity(companyCode);
                } else {
                    final AlertDialog alertDialog = new AlertDialog.Builder(LoginActivity.this)
                            .setTitle(getString(R.string.login_error))
                            .setMessage(bean.getMassage())
                            .setNegativeButton(getString(R.string.confirm), new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                }
                            })
                            .create();
                    alertDialog.show();
                    progressDialog.hide();
                }
            }

            @Override
            public void onFailure(FailureBean bean) {
                super.onFailure(bean);
                progressDialog.dismiss();
                Toast.makeText(LoginActivity.this, getString(R.string.loading_network_error), Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onFinish() {
                progressDialog.dismiss();
                super.onFinish();
            }
        });

网络请求

public class RequestUtil {

    private String mMetyodType; //请求方式,get和post
    private String mUrl;
    private Map<String, Object> mParamsMap; //键值对类型的参数,只有这一种情况下区分post和get。
    private String mJsonStr; //json类型的参数,post方式

    private Map<String, Object> mHeaderMap; //头参数
    private OkhttpListener mCallBack;       //回调
    private static OkHttpClient mOkHttpClient;
    private Request.Builder mRequestBuilder;
    private Request mOkHttpRequest;

    RequestUtil(String methodType, String url, Map<String, Object> paramsMap, Map<String, Object> headerMap, OkhttpListener callBack) {
        this(methodType, url, null, paramsMap, headerMap, callBack);
    }

    RequestUtil(String methodType, String url, String jsonStr, Map<String, Object> headerMap, OkhttpListener callBack) {
        this(methodType, url, jsonStr, null, headerMap, callBack);
    }

    private RequestUtil(String methodType, String url, String jsonStr, Map<String, Object> paramsMap, Map<String, Object> headerMap, OkhttpListener callBack) {
        mMetyodType = methodType;
        mUrl = url;
        mJsonStr = jsonStr;
        mParamsMap = paramsMap;
        mHeaderMap = headerMap;
        mCallBack = callBack;
        getInstance();
    }

    /**
     * 创建OKhttpClient实例。
     */
    private void getInstance() {
        mRequestBuilder = new Request.Builder();
        getClientIns();
        //设置参数
        switch (mMetyodType) {
            case OkhttpUtil.METHOD_GET:
                setGetParams();
                break;
            case OkhttpUtil.METHOD_POST:
                mRequestBuilder.post(getRequestBody());
                break;
            case OkhttpUtil.METHOD_PUT:
                mRequestBuilder.put(getRequestBody());
                break;
            case OkhttpUtil.METHOD_DELETE:
                mRequestBuilder.delete(getRequestBody());
                break;
        }
        mRequestBuilder.url(mUrl);
        if (mHeaderMap != null) {
            setMyHeader();
        } else {
            //setHeader();
        }
        //mRequestBuilder.addHeader("Authorization","Bearer "+"token");可以把token添加到这儿
        mOkHttpRequest = mRequestBuilder.build();
    }

    private OkHttpClient getClientIns() {
        if (mOkHttpClient == null) {
            synchronized (RequestUtil.class) {
                if (mOkHttpClient == null) {
                    mOkHttpClient = new OkHttpClient();
                }
            }
        }
        return mOkHttpClient;
    }

    /**
     * request post得到body对象
     */
    private RequestBody getRequestBody() {
        if (!TextUtils.isEmpty(mJsonStr)) {
            MediaType JSON = MediaType.parse("application/json; charset=utf-8");//数据类型为json格式,
            return RequestBody.create(JSON, mJsonStr);//json数据,
        }


        FormBody.Builder formBody = new FormBody.Builder();
        if (mParamsMap != null) {
            for (String key : mParamsMap.keySet()) {
                if (mParamsMap.get(key) != null) {
                    formBody.add(key, mParamsMap.get(key).toString());
                }
            }
        }
        return formBody.build();
    }

    /**
     * get请求,只有键值对参数
     */
    private void setGetParams() {
        if (mParamsMap != null) {
            mUrl = mUrl + "?";
            for (String key : mParamsMap.keySet()) {
                mUrl = mUrl + key + "=" + mParamsMap.get(key) + "&";
            }
            mUrl = mUrl.substring(0, mUrl.length() - 1);

            Log.e("okhttp url:  ", mUrl);
        }
    }
    /**
     * 设置请求头,自己传的
     */
    private void setMyHeader() {
        if (mHeaderMap != null) {
            for (Object key : mHeaderMap.keySet()) {
                mRequestBuilder.addHeader(key.toString(), mHeaderMap.get(key).toString());
            }
        }

    }

    void enqueue() {
        mOkHttpClient.newCall(mOkHttpRequest).enqueue(new Callback() {
            @Override
            public void onFailure(final Call call, final IOException e) {
                if (mCallBack != null) {
                    mCallBack.onError(call, e);
                }
            }

            @Override
            public void onResponse(final Call call, final Response response) throws IOException {
                if (mCallBack != null) {
                    mCallBack.onSeccess(call, response);
                }
            }

        });
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值