Glint是Android实现基于OkHttp的Http标准协议框架,支持接口请求,文件下载,文件上传,WebSocket四大功能。
- 底层框架为OkHttp
- 支持异步请求、支持同步请求
- 支持文件上传
- 支持文件下载,支持暂停和恢复,断点续传
- 支持长连接,兼容柚子IO
- 失败重试机制
- 智能生命周期,避免离开Activity或Fragment后导致内存泄露
- 自定义HttpModule,用于自定义解析请求结果和添加公共参数
- 支持取消某个请求、取消所有请求
- 入口好记,分别是GlintHttp,GlintDownload,GlintUpload,GlintSocket
推荐使用 Maven:
dependencies {
implementation 'com.ysbing.glint:glint:1.1.4'
}
最基本的请求:
String url = "https://www.sojson.com/open/api/lunar/json.shtml?date=2017-05-27";
GlintHttp.get(url).execute(new GlintHttpListener<String>() {
@Override
public void onSuccess(@NonNull String result) throws Throwable {
super.onSuccess(result);
}
});
新建一个类,继承BaseHttpModule,使用HttpModule有两种使用方式
第一种方式:在AndroidManifest文件中声明该Module作为该Application通用的Module,需注意的是,每一个Application只能拥有一个通用的Module。
<meta-data
android:name="com.ysbing.samples.glint.http.MyHttpModule"
android:value="GlintHttpModule"
/>
第二种方式:在单独请求的时候,使用using方法,将该Module传入。
如果以上两种方式都不使用的话,将采取标准的json解析到对应的实体类。
使用第一种方式的HttpModule类必须是public的,以便在GlintHttp延迟初始化时,可以通过反射将它们实例化。
带有配置的请求,使用using方法
String url = "https://www.sojson.com/open/api/lunar/json.shtml";
TreeMap<String, String> params = new TreeMap<>();
params.put("date", "2018-10-01");
GlintHttp.get(url, params).using(MyHttpModule.get()).execute(new GlintHttpListener<LunarBean>() {
@Override
public void onSuccess(@NonNull LunarBean result) throws Throwable {
super.onSuccess(result);
}
@Override
public void onFail(@NonNull Throwable error) {
super.onFail(error);
}
@Override
public void onFinish() {
super.onFinish();
}
});
其他使用方法请查阅GlintHttp的公开方法。
参数使用TreeMap来装载数据,使用时,请勿传入null键
复写BaseHttpModule里的onOkHttpBuildCreate方法
@Override
public OkHttpClient.Builder onOkHttpBuildCreate(@NonNull Glint.GlintType clientType, @NonNull OkHttpClient.Builder builder) {
return builder.readTimeout(3000L, TimeUnit.MILLISECONDS)
.writeTimeout(5000L, TimeUnit.MILLISECONDS);
}
public class MyHttpModule extends BaseHttpModule {
public static MyHttpModule get() {
return new MyHttpModule();
}
@Override
public OkHttpClient.Builder onOkHttpBuildCreate(@NonNull Glint.GlintType clientType, @NonNull OkHttpClient.Builder builder) {
return builder.readTimeout(3000L, TimeUnit.MILLISECONDS)
.writeTimeout(5000L, TimeUnit.MILLISECONDS);
}
@Override
public <E extends BaseHttpModule> void configDefaultBuilder(@NonNull GlintBaseBuilder<E> builder) {
super.configDefaultBuilder(builder);
}
@Override
public boolean getHeaders(@NonNull Map<String, String> originalHeader) throws Exception {
return super.getHeaders(originalHeader);
}
@Override
public boolean getParams(@NonNull TreeMap<String, String> originalParams) throws Exception {
return super.getParams(originalParams);
}
@Override
public boolean getParams(@NonNull TreeMap<String, String> originalParams, @Nullable JsonObject originalJsonParams) throws Exception {
return super.getParams(originalParams, originalJsonParams);
}
@Override
public UrlResult getUrl(@NonNull String originalUrl) throws Exception {
return super.getUrl(originalUrl);
}
@Override
public <T> boolean customDeserialize(@NonNull GlintResultBean<T> result, @NonNull JsonObject jsonObj, @NonNull Gson gson, @NonNull Type typeOfT) throws Exception {
JsonElement statusElement = jsonObj.get("status");
JsonElement messageElement = jsonObj.get("message");
JsonElement dataElement = jsonObj.get("data");
// 如果为空,可能是标准的json,不用判断状态码,直接解析
if (statusElement == null) {
result.setRunStatus(Glint.ResultStatus.STATUS_NORMAL);
result.setData(GlintRequestUtil.<T>standardDeserialize(gson, jsonObj, typeOfT));
} else {
// status节点,这里判断出是否请求成功
int status = statusElement.getAsInt();
if (messageElement != null) {
// message节点
String message = messageElement.getAsString();
result.setMessage(message);
}
result.setStatus(status);
if (status == 200) {
result.setRunStatus(Glint.ResultStatus.STATUS_SUCCESS);
if (dataElement != null) {
result.setData(GlintRequestUtil.<T>successDeserialize(gson, dataElement, typeOfT));
}
} else {
result.setRunStatus(Glint.ResultStatus.STATUS_ERROR);
}
}
return false;
}
}
这样就全部配置完毕了,如果你不需要这个高级配置的话,可无需任何配置也可以正常使用,在这份配置中,onOkHttpBuildCreate方法在本进程只执行一次,其他方法在每个请求都会执行。
下面是基本的使用方法
GlintDownload.download("https://qd.myapp.com/myapp/qqteam/AndroidQQ/mobileqq_android.apk", new File(getExternalCacheDir(), "mobileqq_android.apk")).execute(new GlintDownloadListener() {
@Override
public void onProgress(long bytesWritten, long contentLength, long speed, int percent) throws Exception {
super.onProgress(bytesWritten, contentLength, speed, percent);
}
@Override
public void onSuccess(@NonNull File result) throws Throwable {
super.onSuccess(result);
}
});
更多高级用法可参阅源码,如下载过程支持可取消,可暂停和恢复。
下面是基本的使用方法:
GlintUpload.upload("https://www.qq.com/", new File(getExternalCacheDir(), "mobileqq_android.apk")).execute(new GlintUploadListener<String>() {
@Override
public void onProgress(long bytesWritten, long contentLength, long speed, int percent) throws Throwable {
super.onProgress(bytesWritten, contentLength, speed, percent);
}
@Override
public void onSuccess(@NonNull String result) throws Throwable {
super.onSuccess(result);
}
});
GlintSocket.sendIO(url, "cmd", "我是消息").execute(new GlintSocketListener<String>() {
@Override
public void onProcess(@NonNull String result) throws Throwable {
super.onProcess(result);
}
@Override
public void onError(@NonNull String error) {
super.onError(error);
}
});
注意,GlintSocketRequest有send和sendIO和两个方法,如果连接的是WebSocket就使用send,连接的是柚子IO就使用sendIO
GlintSocket.on("http://socket.test", "cmd").execute(new GlintSocketListener<String>() {
@Override
public void onProcess(@NonNull String result) throws Throwable {
super.onProcess(result);
}
@Override
public void onError(@NonNull String error) {
super.onError(error);
}
});
当不需要Socket的时候,记住要将该连接做释放处理,否则会导致内存泄露,释放的使用方法如下:
GlintSocket.off("http://socket.test", "cmd");
Context context = ContextHelper.getAppContext();
Application application = ContextHelper.getApplication();
String strMd5 = Md5Util.getMD5Str("hello, world");
String fileMd5 = Md5Util.getMD5Str(new File("demo.txt"));
UiKit.runOnMainThreadAsync(new Runnable() {
@Override
public void run() {
}
});
UiKit.runOnMainThreadSync(new Runnable() {
@Override
public void run() {
}
});
UiKit.runOnMainThreadSync(new Runnable() {
@Override
public void run() {
}
}, 1000, false);