目录
AndroidSDK开发5不用第三库开发一个SDK
前言:
一.解决的问题如下:
1.不用引入任何的第三方库,所以不会额外增加apk大小.
2.不会出现导入重复的aar包或者依赖.
3.不会出现因引入不同的aar依赖版本导致项目出现兼容性或者冲突问题.
4.符合sdk开发尽量不依赖第三方和包尽量小的原则.
5.用户集成简单,调用方便.
6.不用担心第三方依赖库的版本升级问题.
7.不用处理第三库的混淆问题.
二、SDK具体实现如下:
1.网络请求结果回调接口如下:
2.网络请求结果类如下:
3.网络请求基类封装:
4.网络请求结果回调封装:
5.常量工具类封装:
6.application初始化:
7.SDK初始化管理:
三.SDK简单集成如下:
1.新建一个项目,在App的build.gradle引入libs配置:
2.引入自己开发的aar:
3.SDK初始化如下:
4.调用获取首页广告接口:
5.打印请求结果为:
6.由于前面几篇博客讲解sdk初始化、如何把项目或者module打包成aar、使用wanAndroidapi写一个SDK以及sdk开发的心得,这里就不详细展开讲解了,具体的内容参考以下之前的博客:
7.本文博客源码地址如下:
8.总结:
AndroidSDK开发5不用第三库开发一个SDK
前言:
前面一篇文章写了如何用okhttp+retrofit+rxjava等第三方库开发一个sdk,只能算一个简单的入门篇,就是把网络请求封装成接口,然后提供一个方法供别人调用,根据相应需求传入参数。但是这样很不好,如果aar不放远程仓库的话,用户还要导入相应的第三方依赖,无形之中会增加apk大小,而且如果客户用相同的库版本不一样,会出现重复导包和兼容性问题,这样也会增加用户集成难度,虽然可以解决,但是这样很麻烦,调用起来也不方便,为了解决以上问题,因此诞生了此篇文章,在不使用任何第三方库的情况下进行SDK开发.
一.解决的问题如下:
1.不用引入任何的第三方库,所以不会额外增加apk大小.
2.不会出现导入重复的aar包或者依赖.
3.不会出现因引入不同的aar依赖版本导致项目出现兼容性或者冲突问题.
4.符合sdk开发尽量不依赖第三方和包尽量小的原则.
5.用户集成简单,调用方便.
6.不用担心第三方依赖库的版本升级问题.
7.不用处理第三库的混淆问题.
二、SDK具体实现如下:
1.网络请求结果回调接口如下:
2.不会出现导入重复的aar包或者依赖.
3.不会出现因引入不同的aar依赖版本导致项目出现兼容性或者冲突问题.
4.符合sdk开发尽量不依赖第三方和包尽量小的原则.
5.用户集成简单,调用方便.
6.不用担心第三方依赖库的版本升级问题.
7.不用处理第三库的混淆问题.
二、SDK具体实现如下:
1.网络请求结果回调接口如下:
4.符合sdk开发尽量不依赖第三方和包尽量小的原则.
5.用户集成简单,调用方便.
6.不用担心第三方依赖库的版本升级问题.
7.不用处理第三库的混淆问题.
二、SDK具体实现如下:
1.网络请求结果回调接口如下:
6.不用担心第三方依赖库的版本升级问题.
7.不用处理第三库的混淆问题.
二、SDK具体实现如下:
1.网络请求结果回调接口如下:
二、SDK具体实现如下:
1.网络请求结果回调接口如下:
public interface WanHttpRequestCallBack {
Boolean onResponse(String response);
Boolean onFailed(String message);
}
2.网络请求结果类如下:
package com.example.wanandroidsdk.http; public class WanAndroidHttpResult{ 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 params;
private final WanHttpUtils.OnResponseListener listener;
private final byte[] lock = new byte[0];
private boolean isCancel = false;
public RequestThread(Map params, WanHttpUtils.OnResponseListener listener) {
this.params = params;
this.listener = listener;
}
public void run() {
WanAndroidHttpResult 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 doRequest(Map params) {
if (params == null) {
return null;
} else {
WanAndroidHttpResult 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 doRequestGet(Map params) {
if (params == null) {
return null;
} else {
WanAndroidHttpResult 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();
}
}
});
}
private static WanHttpUtils.RequestThread getHomeBanner(WanHttpUtils.OnResponseListener responseListener) {
if (responseListener == null) {
return null;
}
Map 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;
}
private static WanHttpUtils.RequestThread getHotKey(WanHttpUtils.OnResponseListener responseListener){
if (responseListener == null) {
return null;
}
Map 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();
Map 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 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();
Map 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 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 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;
}
Map 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 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 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 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 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;
}
Map 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 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 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 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 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 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 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 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 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 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"
}
}
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 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.



