目录
3.不会出现因引入不同的aar依赖版本导致项目出现兼容性或者冲突问题.
1.新建一个项目,在App的build.gradle引入libs配置:
6.由于前面几篇博客讲解sdk初始化、如何把项目或者module打包成aar、使用wanAndroidapi写一个SDK以及sdk开发的心得,这里就不详细展开讲解了,具体的内容参考以下之前的博客:
AndroidSDK开发5不用第三库开发一个SDK
前言:
前面一篇文章写了如何用okhttp+retrofit+rxjava等第三方库开发一个sdk,只能算一个简单的入门篇,就是把网络请求封装成接口,然后提供一个方法供别人调用,根据相应需求传入参数。但是这样很不好,如果aar不放远程仓库的话,用户还要导入相应的第三方依赖,无形之中会增加apk大小,而且如果客户用相同的库版本不一样,会出现重复导包和兼容性问题,这样也会增加用户集成难度,虽然可以解决,但是这样很麻烦,调用起来也不方便,为了解决以上问题,因此诞生了此篇文章,在不使用任何第三方库的情况下进行SDK开发.
一.解决的问题如下:
1.不用引入任何的第三方库,所以不会额外增加apk大小.
2.不会出现导入重复的aar包或者依赖.
3.不会出现因引入不同的aar依赖版本导致项目出现兼容性或者冲突问题.
4.符合sdk开发尽量不依赖第三方和包尽量小的原则.
5.用户集成简单,调用方便.
6.不用担心第三方依赖库的版本升级问题.
7.不用处理第三库的混淆问题.
二、SDK具体实现如下:
1.网络请求结果回调接口如下:
public interface WanHttpRequestCallBack { Boolean onResponse(String response); Boolean onFailed(String message); }
2.网络请求结果类如下:
package com.example.wanandroidsdk.http; /** * @author: njb * @date: 2021/3/23 17:32 * @desc: */ public class WanAndroidHttpResult<T> { /** * 记录请求回来的错误状态描述 */ private Integer errorCode; /** * 记录请求回来的错误状态描述 */ private String errorMsg = ""; /** * 记录返回的数据 */ private T data; /** * 业务是否成功 */ public boolean isBizSucceed(boolean defaultValue) { return null == errorCode ? defaultValue : errorCode == 0; } public T getData() { return data; } public void setData(T data) { this.data = data; } public Integer getErrorCode() { return errorCode; } public void setErrorCode(Integer errorCode) { this.errorCode = errorCode; } public String getErrorMsg() { return errorMsg; } public void setErrorMsg(String errorMsg) { this.errorMsg = errorMsg; } }
3.网络请求基类封装:
package com.example.wanandroidsdk.http; import android.util.MalformedJsonException; import com.example.wanandroidsdk.utils.LogUtils; import com.example.wanandroidsdk.utils.NetworkUtils; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.SocketTimeoutException; import java.net.URL; import java.util.Map; import java.util.Objects; import static com.example.wanandroidsdk.constants.Constants.DEFAULT_TIMEOUT; import static com.example.wanandroidsdk.constants.Constants.TAG; public class WanHttpUtils { private static volatile WanHttpUtils mInstance; private WanHttpUtils() { } public static WanHttpUtils getInstance() { if (mInstance == null) { synchronized (WanHttpUtils.class) { if (mInstance == null) { mInstance = new WanHttpUtils(); } } } return mInstance; } public interface OnResponseListener { void onResponse(WanAndroidHttpResult httpResult); } public static class RequestThread extends Thread { private final Map<String, String> params; private final WanHttpUtils.OnResponseListener listener; private final byte[] lock = new byte[0]; private boolean isCancel = false; public RequestThread(Map<String, String> params, WanHttpUtils.OnResponseListener listener) { this.params = params; this.listener = listener; } public void run() { WanAndroidHttpResult<String> result = Objects.equals(params.get("Method"), "POST") ? WanHttpUtils.doRequest(this.params) : WanHttpUtils.doRequestGet(this.params); synchronized (this.lock) { if (!this.isCancel) { this.listener.onResponse(result); } } } public void cancel() { synchronized (this.lock) { this.isCancel = true; } } } public static WanAndroidHttpResult<String> doRequest(Map<String, String> params) { if (params == null) { return null; } else { WanAndroidHttpResult<String> result = new WanAndroidHttpResult<>(); try { URL url = new URL(params.get("url")); LogUtils.d(TAG, url.toString()); LogUtils.d(TAG,params.toString() + " --params-- "); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod(params.get("Method")); connection.setReadTimeout(DEFAULT_TIMEOUT); connection.setConnectTimeout(DEFAULT_TIMEOUT); connection.setDoOutput(true); connection.setDoInput(true); connection.setRequestProperty("Connection", "Keep-Alive"); connection.setRequestProperty("Charset", "UTF-8"); connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); connection.setRequestProperty("accept", "application/json"); String requestParamJsonObject = params.get("body"); if (requestParamJsonObject != null && !"".equals(requestParamJsonObject.trim())) { byte[] bytes = requestParamJsonObject.getBytes(); connection.setRequestProperty("Content-Length", String.valueOf(bytes.length)); OutputStream outputStream = connection.getOutputStream(); outputStream.write(bytes); outputStream.flush(); outputStream.close(); } int responseCode = connection.getResponseCode(); if (200 == responseCode) { result.isBizSucceed(true); result.setData(getResponseDataString(connection.getInputStream())); } else { result.isBizSucceed(false); result.setErrorMsg("errorCode:" + responseCode + connection.getResponseMessage()); } } catch (Exception e) { String msg; if (!NetworkUtils.isConnected()) { msg = "请检查网络"; } else if (e instanceof SocketTimeoutException) { msg = "网络请求超时,请稍后重试"; } else if (e instanceof MalformedJsonException) { msg = "数据解析失败"; } else { msg = "请求失败,请稍后重试:" + e.getMessage(); } result.setErrorMsg(msg); } return result; } } public static WanAndroidHttpResult<String> doRequestGet(Map<String, String> params) { if (params == null) { return null; } else { WanAndroidHttpResult<String> result = new WanAndroidHttpResult<>(); try { URL url = new URL(params.get("url")); LogUtils.d(TAG, url.toString()); LogUtils.d(TAG,params.toString() + " --params-- "); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setReadTimeout(DEFAULT_TIMEOUT); connection.setConnectTimeout(DEFAULT_TIMEOUT); // connection.setRequestProperty("Connection", "Keep-Alive"); // connection.setRequestProperty("Charset", "UTF-8"); // connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); // connection.setRequestProperty("accept", "application/json"); int responseCode = connection.getResponseCode(); if (200 == responseCode) { result.isBizSucceed(true); result.setData(getResponseDataString(connection.getInputStream())); } else { result.isBizSucceed(false); result.setErrorMsg("errorCode:" + responseCode + connection.getResponseMessage()); } } catch (Exception e) { String msg = ""; if (!NetworkUtils.isConnected()) { msg = "网络连接失败,请检查网络"; } else if (e instanceof SocketTimeoutException) { msg = "网络请求超时,请稍后重试"; } else if (e instanceof MalformedJsonException) { msg = "数据解析失败"; } else { msg = "请求失败,请稍后重试:" + e.getMessage(); } result.setErrorMsg(msg); } return result; } } private static String getResponseDataString(InputStream inputStream) { InputStreamReader inputStreamReader = new InputStreamReader(inputStream); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); StringBuilder stringBuilder = new StringBuilder(); String temp = null; try { while ((temp = bufferedReader.readLine()) != null) { stringBuilder.append(temp); } } catch (IOException e) { e.printStackTrace(); } finally { try { bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } bufferedReader = null; try { inputStreamReader.close(); } catch (IOException e) { e.printStackTrace(); } inputStreamReader = null; try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } return stringBuilder.toString(); } }
4.网络请求结果回调封装:
package com.example.wanandroidsdk.http; import android.widget.PopupWindow; import android.widget.Toast; import com.example.wanandroidsdk.app.MyApp; import com.example.wanandroidsdk.constants.Constants; import com.example.wanandroidsdk.utils.LogUtils; import org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; import java.util.Map; public class WanHttpRequest { private static final String TAG = "WanHttp"; public static void getBanner(final WanHttpRequestCallBack callBack) { getHomeBanner(new WanHttpUtils.OnResponseListener() { @Override public void onResponse(WanAndroidHttpResult httpResult) { if (httpResult == null && httpResult.getData() == null) { return; } try { String content = httpResult.getData().toString(); if(content != null) { if (httpResult.isBizSucceed(true)) { callBack.onResponse(content); } else { String message = httpResult.getErrorMsg(); callBack.onFailed(message); } LogUtils.e(TAG, content); } } catch (Exception e) { e.printStackTrace(); } } }); } public static void getHotKey(final WanHttpRequestCallBack callBack){ getHotKey(new WanHttpUtils.OnResponseListener() { @Override public void onResponse(WanAndroidHttpResult httpResult) { if (httpResult == null) { return; } try { String content = httpResult.getData().toString(); if (httpResult.isBizSucceed(true)) { callBack.onResponse(content); } else { String message = httpResult.getErrorMsg(); callBack.onFailed(message); } LogUtils.e(TAG, content); } catch (Exception e) { e.printStackTrace(); } } }); } public static void getArticleList(final WanHttpRequestCallBack callBack){ getArticle(new WanHttpUtils.OnResponseListener() { @Override public void onResponse(WanAndroidHttpResult httpResult) { if (httpResult == null) { return; } try { String content = httpResult.getData().toString(); if (httpResult.isBizSucceed(true)) { callBack.onResponse(content); } else { String message = httpResult.getErrorMsg(); callBack.onFailed(message); } LogUtils.e(TAG, content); } catch (Exception e) { e.printStackTrace(); } } },1); } public static void getTreeList(final WanHttpRequestCallBack callBack){ getTree(httpResult -> { if (httpResult == null) { return; } try { String content = httpResult.getData().toString(); if (httpResult.isBizSucceed(true)) { callBack.onResponse(content); } else { String message = httpResult.getErrorMsg(); callBack.onFailed(message); } LogUtils.e(TAG, content); } catch (Exception e) { e.printStackTrace(); } }); } public static void getFriendList(final WanHttpRequestCallBack callBack){ getFriend(new WanHttpUtils.OnResponseListener() { @Override public void onResponse(WanAndroidHttpResult httpResult) { if (httpResult == null) { return; } try { String content = httpResult.getData().toString(); if (httpResult.isBizSucceed(true)) { callBack.onResponse(content); } else { String message = httpResult.getErrorMsg(); callBack.onFailed(message); } LogUtils.e(TAG, content); } catch (Exception e) { e.printStackTrace(); } } }); } public static void getNaviList(final WanHttpRequestCallBack callBack){ getNav(new WanHttpUtils.OnResponseListener() { @Override public void onResponse(WanAndroidHttpResult httpResult) { if (httpResult == null) { return; } try { String content = httpResult.getData().toString(); if (httpResult.isBizSucceed(true)) { callBack.onResponse(content); } else { String message = httpResult.getErrorMsg(); callBack.onFailed(message); } LogUtils.e(TAG, content); } catch (Exception e) { e.printStackTrace(); } } }); } public static void getWxArticle(final WanHttpRequestCallBack callBack){ WxArticle(new WanHttpUtils.OnResponseListener() { @Override public void onResponse(WanAndroidHttpResult httpResult) { if (httpResult == null) { return; } try { String content = httpResult.getData().toString(); if (httpResult.isBizSucceed(true)) { callBack.onResponse(content); } else { String message = httpResult.getErrorMsg(); callBack.onFailed(message); } LogUtils.e(TAG, content); } catch (Exception e) { e.printStackTrace(); } } }); } public static void getProject(final WanHttpRequestCallBack callBack){ project(new WanHttpUtils.OnResponseListener() { @Override public void onResponse(WanAndroidHttpResult httpResult) { if (httpResult == null) { return; } try { String content = httpResult.getData().toString(); if (httpResult.isBizSucceed(true)) { callBack.onResponse(content); } else { String message = httpResult.getErrorMsg(); callBack.onFailed(message); } LogUtils.e(TAG, content); } catch (Exception e) { e.printStackTrace(); } } }); } public static void getQuerySearch(final WanHttpRequestCallBack callBack,int page,String keyWord){ querySearch(new WanHttpUtils.OnResponseListener() { @Override public void onResponse(WanAndroidHttpResult httpResult) { if (httpResult == null) { return; } try { String content = httpResult.getData().toString(); if (httpResult.isBizSucceed(true)) { callBack.onResponse(content); } else { String message = httpResult.getErrorMsg(); callBack.onFailed(message); } LogUtils.e(TAG, content); } catch (Exception e) { e.printStackTrace(); } } },page,keyWord); } public static void getQueryArticle(final WanHttpRequestCallBack callBack,int page,int cid){ queryArticle(new WanHttpUtils.OnResponseListener() { @Override public void onResponse(WanAndroidHttpResult httpResult) { if (httpResult == null) { return; } try { String content = httpResult.getData().toString(); if (httpResult.isBizSucceed(true)) { callBack.onResponse(content); } else { String message = httpResult.getErrorMsg(); callBack.onFailed(message); Toast.makeText(MyApp.getInstance(),message,Toast.LENGTH_SHORT).show(); } LogUtils.e(TAG, content); } catch (Exception e) { e.printStackTrace(); } } },page,cid); } public static void getProjectList(final WanHttpRequestCallBack callBack,int page ,int cid){ projectList(new WanHttpUtils.OnResponseListener() { @Override public void onResponse(WanAndroidHttpResult httpResult) { if (httpResult == null) { return; } try { String content = httpResult.getData().toString(); if (httpResult.isBizSucceed(true)) { callBack.onResponse(content); } else { String message = httpResult.getErrorMsg(); callBack.onFailed(message); } LogUtils.e(TAG, content); } catch (Exception e) { e.printStackTrace(); } } },page,cid); } public static void getArticleTop(final WanHttpRequestCallBack callBack){ articleTop(new WanHttpUtils.OnResponseListener() { @Override public void onResponse(WanAndroidHttpResult httpResult) { if (httpResult == null) { return; } try { String content = httpResult.getData().toString(); if (httpResult.isBizSucceed(true)) { callBack.onResponse(content); } else { String message = httpResult.getErrorMsg(); callBack.onFailed(message); } LogUtils.e(TAG, content); } catch (Exception e) { e.printStackTrace(); } } }); } public static void getSearchAuthor(final WanHttpRequestCallBack callBack,String author){ searchAuthor(new WanHttpUtils.OnResponseListener() { @Override public void onResponse(WanAndroidHttpResult httpResult) { if (httpResult == null) { return; } try { String content = httpResult.getData().toString(); if (httpResult.isBizSucceed(true)) { callBack.onResponse(content); } else { String message = httpResult.getErrorMsg(); callBack.onFailed(message); } LogUtils.e(TAG, content); } catch (Exception e) { e.printStackTrace(); } } },author); } public static void getUserArticle(final WanHttpRequestCallBack callBack,int page){ userArticle(new WanHttpUtils.OnResponseListener() { @Override public void onResponse(WanAndroidHttpResult httpResult) { if (httpResult == null) { return; } try { String content = httpResult.getData().toString(); if (httpResult.isBizSucceed(true)) { callBack.onResponse(content); } else { String message = httpResult.getErrorMsg(); callBack.onFailed(message); } LogUtils.e(TAG, content); } catch (Exception e) { e.printStackTrace(); } } },page); } public static void getUserShare(final WanHttpRequestCallBack callBack,int page){ userShareArticle(new WanHttpUtils.OnResponseListener() { @Override public void onResponse(WanAndroidHttpResult httpResult) { if (httpResult == null) { return; } try { String content = httpResult.getData().toString(); if (httpResult.isBizSucceed(true)) { callBack.onResponse(content); } else { String message = httpResult.getErrorMsg(); callBack.onFailed(message); } LogUtils.e(TAG, content); } catch (Exception e) { e.printStackTrace(); } } },page); } public static void getComments(final WanHttpRequestCallBack callBack,int questionId){ questionComment(new WanHttpUtils.OnResponseListener() { @Override public void onResponse(WanAndroidHttpResult httpResult) { if (httpResult == null) { return; } try { String content = httpResult.getData().toString(); if (httpResult.isBizSucceed(true)) { callBack.onResponse(content); } else { String message = httpResult.getErrorMsg(); callBack.onFailed(message); } LogUtils.e(TAG, content); } catch (Exception e) { e.printStackTrace(); } } },questionId); } public static void getListProject(final WanHttpRequestCallBack callBack){ listProject(new WanHttpUtils.OnResponseListener() { @Override public void onResponse(WanAndroidHttpResult httpResult) { if (httpResult == null) { return; } try { String content = httpResult.getData().toString(); if (httpResult.isBizSucceed(true)) { callBack.onResponse(content); } else { String message = httpResult.getErrorMsg(); callBack.onFailed(message); } LogUtils.e(TAG, content); } catch (Exception e) { e.printStackTrace(); } } }); } public static void getWxArticleList(WanHttpRequestCallBack callBack){ wxArticleList(new WanHttpUtils.OnResponseListener() { @Override public void onResponse(WanAndroidHttpResult httpResult) { if (httpResult == null) { return; } try { String content = httpResult.getData().toString(); if (httpResult.isBizSucceed(true)) { callBack.onResponse(content); } else { String message = httpResult.getErrorMsg(); callBack.onFailed(message); } LogUtils.e(TAG, content); } catch (Exception e) { e.printStackTrace(); } } }); } public static void getWendaList(WanHttpRequestCallBack callBack){ wendaList(new WanHttpUtils.OnResponseListener() { @Override public void onResponse(WanAndroidHttpResult httpResult) { if (httpResult == null) { return; } try { String content = httpResult.getData().toString(); if (httpResult.isBizSucceed(true)) { callBack.onResponse(content); } else { String message = httpResult.getErrorMsg(); callBack.onFailed(message); } LogUtils.e(TAG, content); } catch (Exception e) { e.printStackTrace(); } } }); } public static void getUserRegister(WanHttpRequestCallBack callBack,String username,String password,String repassword) { userRegister(new WanHttpUtils.OnResponseListener() { @Override public void onResponse(WanAndroidHttpResult httpResult) { if (httpResult == null) { return; } try { if(httpResult.getData() != null) { String content = httpResult.getData().toString(); if (httpResult.isBizSucceed(true)) { callBack.onResponse(content); } else { String message = httpResult.getErrorMsg(); callBack.onFailed(message); } LogUtils.e(TAG, content); } } catch (Exception e) { e.printStackTrace(); } } },username,password,repassword); } public static void getUserLogin(WanHttpRequestCallBack callBack,String username,String password){ userLogin(new WanHttpUtils.OnResponseListener() { @Override public void onResponse(WanAndroidHttpResult httpResult) { if (httpResult == null) { return; } try { if(httpResult.getData() != null) { String content = httpResult.getData().toString(); if (httpResult.isBizSucceed(true)) { callBack.onResponse(content); } else { String message = httpResult.getErrorMsg(); callBack.onFailed(message); } LogUtils.e(TAG, content); } } catch (Exception e) { e.printStackTrace(); } } },username,password); } public static void userLogout(WanHttpRequestCallBack callBack){ userLogout(new WanHttpUtils.OnResponseListener() { @Override public void onResponse(WanAndroidHttpResult httpResult) { if (httpResult == null) { return; } try { if(httpResult.getData() != null) { String content = httpResult.getData().toString(); if (httpResult.isBizSucceed(true)) { callBack.onResponse(content); } else { String message = httpResult.getErrorMsg(); callBack.onFailed(message); } LogUtils.e(TAG, content); } } catch (Exception e) { e.printStackTrace(); } } }); } /** * 获取首页banner接口 * * @param responseListener * @return */ private static WanHttpUtils.RequestThread getHomeBanner(WanHttpUtils.OnResponseListener responseListener) { if (responseListener == null) { return null; } Map<String, String> params = new HashMap<>(); String url = Constants.BASE_URL + Constants.BANNER_LIST; params.put("url", url); params.put("Method", "GET"); WanHttpUtils.RequestThread requestThread = new WanHttpUtils.RequestThread(params, responseListener); requestThread.start(); return requestThread; } /** * 获取搜索热词接口 * @param responseListener * @return */ private static WanHttpUtils.RequestThread getHotKey(WanHttpUtils.OnResponseListener responseListener){ if (responseListener == null) { return null; } Map<String, String> params = new HashMap<>(); String url = Constants.BASE_URL + Constants.HOT_KEY; params.put("url", url); params.put("Method", "GET"); WanHttpUtils.RequestThread requestThread = new WanHttpUtils.RequestThread(params, responseListener); requestThread.start(); return requestThread; } private static WanHttpUtils.RequestThread getArticle(WanHttpUtils.OnResponseListener responseListener,int page){ if (responseListener == null){ return null; } JSONObject jsonObject = new JSONObject(); /* try { jsonObject.put("page", page); } catch (JSONException e) { e.printStackTrace(); }*/ Map<String, String> params = new HashMap<>(); String url = Constants.BASE_URL + Constants.ARTICLE_LIST; params.put("url", url); params.put("Method", "GET"); WanHttpUtils.RequestThread requestThread = new WanHttpUtils.RequestThread(params, responseListener); requestThread.start(); return requestThread; } private static WanHttpUtils.RequestThread getTree(WanHttpUtils.OnResponseListener responseListener){ if (responseListener == null){ return null; } Map<String, String> params = new HashMap<>(); String url = Constants.BASE_URL + Constants.TREE; params.put("url", url); params.put("Method", "GET"); WanHttpUtils.RequestThread requestThread = new WanHttpUtils.RequestThread(params, responseListener); requestThread.start(); return requestThread; } private static WanHttpUtils.RequestThread getFriend(WanHttpUtils.OnResponseListener responseListener){ if (responseListener == null){ return null; } JSONObject jsonObject = new JSONObject(); /* try { jsonObject.put("page", page); } catch (JSONException e) { e.printStackTrace(); }*/ Map<String, String> params = new HashMap<>(); String url = Constants.BASE_URL + Constants.FRIEND; params.put("url", url); params.put("Method", "GET"); WanHttpUtils.RequestThread requestThread = new WanHttpUtils.RequestThread(params, responseListener); requestThread.start(); return requestThread; } private static WanHttpUtils.RequestThread getNav(WanHttpUtils.OnResponseListener responseListener){ if(responseListener == null){ return null; } Map<String,String> params = new HashMap<>(); String url = Constants.BASE_URL + Constants.NAVI; params.put("url",url); params.put("Method","GET"); WanHttpUtils.RequestThread requestThread = new WanHttpUtils.RequestThread(params, responseListener); requestThread.start(); return requestThread; } private static WanHttpUtils.RequestThread WxArticle(WanHttpUtils.OnResponseListener responseListener){ if(responseListener == null){ return null; } Map<String,String> params = new HashMap<>(); String url =Constants.BASE_URL + Constants.WXARTICLE; params.put("url",url); params.put("Method","GET"); WanHttpUtils.RequestThread requestThread = new WanHttpUtils.RequestThread(params, responseListener); requestThread.start(); return requestThread; } private static WanHttpUtils.RequestThread project(WanHttpUtils.OnResponseListener responseListener){ if(responseListener == null){ return null; } /* JSONObject jsonObject = new JSONObject(); try { jsonObject.put("page", page); } catch (JSONException e) { e.printStackTrace(); }*/ Map<String,String> params = new HashMap<>(); String url =Constants.BASE_URL +Constants.PROJECT_TREE; params.put("url",url); params.put("Method","GET"); WanHttpUtils.RequestThread requestThread = new WanHttpUtils.RequestThread(params, responseListener); requestThread.start(); return requestThread; } private static WanHttpUtils.RequestThread querySearch(WanHttpUtils.OnResponseListener responseListener,int page,String keyword){ if(responseListener == null){ return null; } Map<String,String> stringMap = new HashMap<>(); String url =Constants.BASE_URL + Constants.QUERY_ARTICLE + page + Constants.QUERY_ARTICLE_END + "?k=" + keyword; stringMap.put("url",url); stringMap.put("Method","POST"); stringMap.put("body","}"); WanHttpUtils.RequestThread requestThread = new WanHttpUtils.RequestThread(stringMap, responseListener); requestThread.start(); return requestThread; } private static WanHttpUtils.RequestThread queryArticle(WanHttpUtils.OnResponseListener responseListener,int page,int cid){ if(responseListener == null){ return null; } JSONObject jsonObject = new JSONObject(); try { jsonObject.put("page",page); jsonObject.put("cid",cid); } catch (JSONException e) { e.printStackTrace(); } Map<String,String> stringMap = new HashMap<>(); String url =Constants.BASE_URL + Constants.ARTICLE_URL_START + page + Constants.ARTICLE_URL_END + "?cid=" + cid ; stringMap.put("url",url); stringMap.put("Method","GET"); WanHttpUtils.RequestThread requestThread = new WanHttpUtils.RequestThread(stringMap, responseListener); requestThread.start(); return requestThread; } private static WanHttpUtils.RequestThread projectList(WanHttpUtils.OnResponseListener responseListener,int page,int cid){ if(responseListener == null){ return null; } JSONObject jsonObject = new JSONObject(); try { jsonObject.put("page",page); jsonObject.put("cid",cid); } catch (JSONException e) { e.printStackTrace(); } Map<String,String> stringMap = new HashMap<>(); String url =Constants.BASE_URL + Constants.PROJECT_LIST_START + page + Constants.PROJECT_LIST_END + "?cid=" + cid ; stringMap.put("url",url); stringMap.put("Method","GET"); WanHttpUtils.RequestThread requestThread = new WanHttpUtils.RequestThread(stringMap, responseListener); requestThread.start(); return requestThread; } private static WanHttpUtils.RequestThread articleTop(WanHttpUtils.OnResponseListener responseListener){ if(responseListener == null){ return null; } Map<String,String> stringMap = new HashMap<>(); String url =Constants.BASE_URL + Constants.ARTICLE_TOP; stringMap.put("url",url); stringMap.put("Method","GET"); WanHttpUtils.RequestThread requestThread = new WanHttpUtils.RequestThread(stringMap, responseListener); requestThread.start(); return requestThread; } private static WanHttpUtils.RequestThread searchAuthor(WanHttpUtils.OnResponseListener responseListener,String author){ if(responseListener == null){ return null; } /* JSONObject jsonObject = new JSONObject(); try { jsonObject.put("author",author); } catch (JSONException e) { e.printStackTrace(); }*/ Map<String,String> stringMap = new HashMap<>(); String url =Constants.BASE_URL + Constants.SEARCH_AUTHOR + "?author=" +author ; stringMap.put("url",url); stringMap.put("Method","GET"); WanHttpUtils.RequestThread requestThread = new WanHttpUtils.RequestThread(stringMap, responseListener); requestThread.start(); return requestThread; } private static WanHttpUtils.RequestThread userArticle(WanHttpUtils.OnResponseListener responseListener,int page){ Map<String,String> stringMap = new HashMap<>(); String url = Constants.BASE_URL + Constants.USER_ARTICLE_START + page + Constants.USER_ARTICLE_END ; stringMap.put("url",url); stringMap.put("Method","GET"); WanHttpUtils.RequestThread requestThread = new WanHttpUtils.RequestThread(stringMap, responseListener); requestThread.start(); return requestThread; } private static WanHttpUtils.RequestThread userShareArticle(WanHttpUtils.OnResponseListener responseListener,int page){ if(responseListener == null){ return null; } Map<String,String> params = new HashMap<>(); String url = Constants.BASE_URL + Constants.USER_SHARE_ARTICLE_START + page + Constants.USER_SHARE_ARTICLE_END; params.put("url",url); params.put("Method","GET"); WanHttpUtils.RequestThread requestThread = new WanHttpUtils.RequestThread(params,responseListener); requestThread.start(); return requestThread; } private static WanHttpUtils.RequestThread questionComment(WanHttpUtils.OnResponseListener responseListener,int questionId){ if(responseListener == null){ return null; } Map<String,String> stringMap = new HashMap<>(); String url = Constants.BASE_URL + Constants.WENDA_COMMENTS_START + questionId + Constants.WENDA_COMMENTS_END; stringMap.put("url",url); stringMap.put("Method","GET"); WanHttpUtils.RequestThread requestThread = new WanHttpUtils.RequestThread(stringMap,responseListener); requestThread.start(); return requestThread; } private static WanHttpUtils.RequestThread listProject(WanHttpUtils.OnResponseListener responseListener){ if(responseListener == null){ return null; } Map<String,String> stringMap = new HashMap<>(); String url = Constants.BASE_URL + Constants.LIST_PROJECT; stringMap.put("url",url); stringMap.put("Method","GET"); WanHttpUtils.RequestThread requestThread = new WanHttpUtils.RequestThread(stringMap,responseListener); requestThread.start(); return requestThread; } private static WanHttpUtils.RequestThread wxArticleList(WanHttpUtils.OnResponseListener responseListener){ if(responseListener == null){ return null; } Map<String,String> stringMap = new HashMap<>(); String url = Constants.BASE_URL + Constants.WXARTICLE_LIST; stringMap.put("url",url); stringMap.put("Method","GET"); WanHttpUtils.RequestThread requestThread = new WanHttpUtils.RequestThread(stringMap,responseListener); requestThread.start(); return requestThread; } private static WanHttpUtils.RequestThread wendaList(WanHttpUtils.OnResponseListener responseListener){ if(responseListener == null){ return null; } Map<String,String> stringMap = new HashMap<>(); String url = Constants.BASE_URL + Constants.WENDA_LIST; stringMap.put("url",url); stringMap.put("Method","GET"); WanHttpUtils.RequestThread requestThread = new WanHttpUtils.RequestThread(stringMap,responseListener); requestThread.start(); return requestThread; } private static WanHttpUtils.RequestThread userRegister(WanHttpUtils.OnResponseListener responseListener,String username,String password,String repassword){ if(responseListener == null){ return null; } JSONObject jsonObject = new JSONObject(); try { jsonObject.put("username",username); jsonObject.put("password",password); jsonObject.put("repassword",repassword); } catch (JSONException e) { e.printStackTrace(); } Map<String,String> stringMap = new HashMap<>(); String url =Constants.BASE_URL + Constants.USER_REGISTER +"?username=" + username + "&password=" + password + "&repassword="+ repassword; stringMap.put("url",url); stringMap.put("Method","POST"); stringMap.put("body","}"); WanHttpUtils.RequestThread requestThread = new WanHttpUtils.RequestThread(stringMap,responseListener); requestThread.start(); return requestThread; } private static WanHttpUtils.RequestThread userLogin(WanHttpUtils.OnResponseListener responseListener,String username,String password){ if(responseListener == null){ return null; } Map<String,String> stringMap = new HashMap<>(); String url =Constants.BASE_URL + Constants.USER_LOGIN +"?username=" + username + "&password=" + password; stringMap.put("url",url); stringMap.put("Method","POST"); stringMap.put("body","}"); WanHttpUtils.RequestThread requestThread = new WanHttpUtils.RequestThread(stringMap,responseListener); requestThread.start(); return requestThread; } private static WanHttpUtils.RequestThread userLogout(WanHttpUtils.OnResponseListener responseListener){ if(responseListener == null){ return null; } Map<String,String> stringMap = new HashMap<>(); String url =Constants.BASE_URL + Constants.USER_LOGOUT; stringMap.put("url",url); stringMap.put("Method","GET"); WanHttpUtils.RequestThread requestThread = new WanHttpUtils.RequestThread(stringMap,responseListener); requestThread.start(); return requestThread; } }
5.常量工具类封装:
package com.example.wanandroidsdk.constants; public class Constants { public static final String BASE_URL = "https://www.wanandroid.com"; public static final int DEFAULT_TIMEOUT = 20000;//10秒 public static final String TAG = "WanHttp"; //获取首页banner列表 public static final String BANNER_LIST = "/banner/json"; //文章列表 public static final String ARTICLE_LIST = "/article/list/1/json"; //搜索热词 public static final String HOT_KEY = "/hotkey/json"; //体系数据 public static final String TREE = "/tree/json"; //常用网站 public static final String FRIEND = "/friend/json"; //导航 public static final String NAVI = "/navi/json"; //公众号列表 public static final String WXARTICLE = "/wxarticle/chapters/json"; //查看某个公众号历史数据 public static final String WXARTICLE_LIST = "/wxarticle/list/408/1/json"; //项目分类 public static final String PROJECT_TREE = "/project/tree/json"; //项目列表数据 public static final String PROJECT_LIST_START = "/project/list/"; public static final String PROJECT_LIST_END = "/json/"; //搜索 public static final String QUERY_ARTICLE = "/article/query/"; public static final String QUERY_ARTICLE_END = "/json"; //知识体系下的文章 public static final String ARTICLE_URL_START = "/article/list/"; public static final String ARTICLE_URL_END = "/json"; //置顶文章 public static final String ARTICLE_TOP = "/article/top/json"; //按照作者昵称搜索文章 public static final String SEARCH_AUTHOR = "/article/list/0/json"; //广场列表 public static final String USER_ARTICLE_START = "/user_article/list/"; public static final String USER_ARTICLE_END = "/json"; //分享人对应列表数据 public static final String USER_SHARE_ARTICLE_START = "/user/2/share_articles/"; public static final String USER_SHARE_ARTICLE_END = "/json"; //问答评论列表 public static final String WENDA_COMMENTS_START ="/wenda/comments/"; public static final String WENDA_COMMENTS_END ="/json"; //最新tab public static final String LIST_PROJECT = "/article/listproject/0/json"; public static final String WENDA_LIST = "/wenda/list/1/json"; //用户注册 public static final String USER_REGISTER = "/user/register"; //用户登录 public static final String USER_LOGIN = "/user/login"; //用户退出 public static final String USER_LOGOUT = "/user/logout/json"; }
6.application初始化:
public class MyApp extends Application { private static Application mInstance; @Override public void onCreate() { super.onCreate(); mInstance = this; } public static void setApp(Application app){ mInstance = app; } public static Application getInstance() { return mInstance; } }
7.SDK初始化管理:
public class WanAndroidManager { private static Context mContent; public static void init(Application application) { mContent = application.getApplicationContext(); } }
三.SDK简单集成如下:
1.新建一个项目,在App的build.gradle引入libs配置:
repositories { //libs 目录 flatDir { dirs "libs" } }
2.引入自己开发的aar:
dependencies { implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'com.google.android.material:material:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' implementation(name: 'wan', ext: 'aar') }
3.SDK初始化如下:
public class App extends Application { @Override public void onCreate() { super.onCreate(); MyApp.setApp(this); } }
4.调用获取首页广告接口:
private void getBannerData() { WanHttpRequest.getBanner(new WanHttpRequestCallBack() { @Override public Boolean onResponse(String bannerBeans) { try { JSONObject jsonObject = new JSONObject(bannerBeans); List<BannerBean> list = new ArrayList<>(); JSONArray array = jsonObject.getJSONArray("data"); if (array != null && array.length() > 0) { for (int i = 0; i < array.length(); i++) { BannerBean bannerBean = new BannerBean(); JSONObject object = array.getJSONObject(i); bannerBean.setId(object.getInt("id")); bannerBean.setUrl(object.getString("url")); bannerBean.setDesc(object.getString("desc")); bannerBean.setImagePath(object.getString("imagePath")); bannerBean.setIsVisible(object.getInt("isVisible")); bannerBean.setOrder(object.getInt("order")); bannerBean.setTitle(object.getString("title")); bannerBean.setType(object.getInt("type")); list.add(bannerBean); } Log.d(Constants.TAG, list.get(0).getTitle()); } } catch (JSONException e) { e.printStackTrace(); } return null; } @Override public Boolean onFailed(String message) { Log.d(Constants.TAG, message); return null; } } ); }
5.打印请求结果为:
6.由于前面几篇博客讲解sdk初始化、如何把项目或者module打包成aar、使用wanAndroidapi写一个SDK以及sdk开发的心得,这里就不详细展开讲解了,具体的内容参考以下之前的博客:
Android SDK开发1将完整项目或Module打包成aar
Android SDK开发1将完整项目或Module打包成aar_淡淡的香烟的博客-CSDN博客_aar
AndroidSDK开发2SDK初始化问题
AndroidSDK开发2SDK初始化问题_淡淡的香烟的博客-CSDN博客_如何初始化sdk
Androidsdk开发3之用WanAndroidApi写一个sdk
Androidsdk开发3之用WanAndroidApi写一个sdk_淡淡的香烟的博客-CSDN博客
Android SDK开发4之心得体会
Android SDK开发4之心得体会_淡淡的香烟的博客-CSDN博客_android开发心得体会
7.本文博客源码地址如下:
https://gitee.com/jackning_admin/wanandroidsdk-http
8.总结:
本篇文章讲解了不使用第三方如何开发一个简单的sdk,从上面的截图和日志可以看到请求是成功的,而且结果也正常返回,这里只是简单的写了一个接口示例,因为用的是鸿洋大神的wanAndroid里面的开源api接口,都是一些很简单的接口和请求,一样的代码这里就不写多次了,使用HttpurlConnection做sdk接口请求是很常见的,希望本篇文章对大家用帮助,大家可以尝试一下写一个属于自己的简单sdk,像一些游戏、支付、音视频都是类似的做法,只是有不同的业务,进行不同的接口封装和参数传递,处理不同逻辑,下一篇分享一下使用kotlin开发的sdk,不过在sdk开发中很少这么干,因为不稳定和兼容性问题很多,所以现在市场上大部分sdk还是使用的java.