Android okhttp3使用实例,OKhttp设置请求超时时间,okgo使用demo,SSL证书验证

 SSL证书验证

 rootca证书资源

 

 

 调用

            //信任所有证书
            HTTPSCerUtils.setTrustAllCertificate(okHttpBuilder);
 
            //信任raw资源目录下的证书
            HTTPSCerUtils.setCertificate(context, okHttpBuilder, R.raw.rootca);
 
            //传入证书字符串
            HTTPSCerUtils.setCertificate(context,okHttpBuilder,"!@$#@!$@#^@^#!");

 

工具方法: 

import android.content.Context;import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;import okhttp3.OkHttpClient;public class HTTPSCerUtils {//信任所有证书public static void setTrustAllCertificate(OkHttpClient.Builder okHttpClientBuilder) {try {SSLContext sc = SSLContext.getInstance("TLS");X509TrustManager trustAllManager = new X509TrustManager() {@Overridepublic void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}@Overridepublic void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}@Overridepublic X509Certificate[] getAcceptedIssuers() {return new X509Certificate[0];}};sc.init(null, new TrustManager[]{trustAllManager}, new SecureRandom());okHttpClientBuilder.sslSocketFactory(sc.getSocketFactory(), trustAllManager);//如果需要兼容安卓5.0以下,可以使用这句//okHttpClientBuilder.sslSocketFactory(new TLSSocketFactory(), trustAllManager);okHttpClientBuilder.hostnameVerifier(new HostnameVerifier() {@Overridepublic boolean verify(String hostname, SSLSession session) {return true;}});} catch (Exception e) {e.printStackTrace();}}//只信任指定证书(传入字符串)public static void setCertificate(Context context, OkHttpClient.Builder okHttpClientBuilder, String cerStr) {try {CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(cerStr.getBytes());Certificate ca = certificateFactory.generateCertificate(byteArrayInputStream);KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());keyStore.load(null, null);keyStore.setCertificateEntry("ca", ca);byteArrayInputStream.close();TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());tmf.init(keyStore);SSLContext sslContext = SSLContext.getInstance("TLS");sslContext.init(null, tmf.getTrustManagers(), new SecureRandom());okHttpClientBuilder.sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) tmf.getTrustManagers()[0]);okHttpClientBuilder.hostnameVerifier(new HostnameVerifier() {@Overridepublic boolean verify(String hostname, SSLSession session) {return true;}});} catch (Exception e) {e.printStackTrace();}}//只信任指定证书(传入raw资源ID)public static void setCertificate(Context context, OkHttpClient.Builder okHttpClientBuilder, int cerResID) {try {CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");InputStream inputStream = context.getResources().openRawResource(cerResID);Certificate ca = certificateFactory.generateCertificate(inputStream);KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());keyStore.load(null, null);keyStore.setCertificateEntry("ca", ca);inputStream.close();TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());tmf.init(keyStore);SSLContext sslContext = SSLContext.getInstance("TLS");sslContext.init(null, tmf.getTrustManagers(), new SecureRandom());okHttpClientBuilder.sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) tmf.getTrustManagers()[0]);okHttpClientBuilder.hostnameVerifier(new HostnameVerifier() {@Overridepublic boolean verify(String hostname, SSLSession session) {return true;}});} catch (Exception e) {e.printStackTrace();}}//批量信任证书public static void setCertificates(Context context, OkHttpClient.Builder okHttpClientBuilder, int... cerResIDs) {try {CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());keyStore.load(null, null);for (int i = 0; i < cerResIDs.length; i++) {Certificate ca = certificateFactory.generateCertificate(context.getResources().openRawResource(cerResIDs[i]));keyStore.setCertificateEntry("ca" + i, ca);}TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());tmf.init(keyStore);SSLContext sslContext = SSLContext.getInstance("TLS");sslContext.init(null, tmf.getTrustManagers(), new SecureRandom());okHttpClientBuilder.sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) tmf.getTrustManagers()[0]);okHttpClientBuilder.hostnameVerifier(new HostnameVerifier() {@Overridepublic boolean verify(String hostname, SSLSession session) {return true;}});} catch (Exception e) {e.printStackTrace();}}
}

 

1、导入OKhttp依赖

implementation 'com.squareup.okhttp3:okhttp:3.10.0'

 

compile 'com.squareup.okhttp3:okhttp:3.4.1'

2、创建请求工具类

三个工具类

/*** 作者:created by meixi* 邮箱:15913707499@163.com* 日期:2019/4/10 15*/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";public static final String FILE_TYPE_FILE = "file/*";public static final String FILE_TYPE_IMAGE = "image/*";public static final String FILE_TYPE_AUDIO = "audio/*";public static final String FILE_TYPE_VIDEO = "video/*";/*** get请求* @param url:url* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。*/public static void okHttpGet(String url, CallBackUtil callBack) {okHttpGet(url, null, null, callBack);}/*** get请求,可以传递参数* @param url:url* @param paramsMap:map集合,封装键值对参数* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。*/public static void okHttpGet(String url, Map<String, String> paramsMap, CallBackUtil callBack) {okHttpGet(url, paramsMap, null, callBack);}/*** get请求,可以传递参数* @param url:url* @param paramsMap:map集合,封装键值对参数* @param headerMap:map集合,封装请求头键值对* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。*/public static void okHttpGet(String url, Map<String, String> paramsMap, Map<String, String> headerMap, CallBackUtil callBack) {new RequestUtil(METHOD_GET, url, paramsMap, headerMap, callBack).execute();}/*** post请求* @param url:url* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。*/public static void okHttpPost(String url, CallBackUtil callBack) {okHttpPost(url, null, callBack);}/*** post请求,可以传递参数* @param url:url* @param paramsMap:map集合,封装键值对参数* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。*/public static void okHttpPost(String url, Map<String, String> paramsMap, CallBackUtil callBack) {okHttpPost(url, paramsMap, null, callBack);}/*** post请求,可以传递参数* @param url:url* @param paramsMap:map集合,封装键值对参数* @param headerMap:map集合,封装请求头键值对* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。*/public static void okHttpPost(String url, Map<String, String> paramsMap, Map<String, String> headerMap, CallBackUtil callBack) {new RequestUtil(METHOD_POST, url, paramsMap, headerMap, callBack).execute();}/*** post请求* @param url:url* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。*/public static void okHttpPut(String url, CallBackUtil callBack) {okHttpPut(url, null, callBack);}/*** post请求,可以传递参数* @param url:url* @param paramsMap:map集合,封装键值对参数* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。*/public static void okHttpPut(String url, Map<String, String> paramsMap, CallBackUtil callBack) {okHttpPut(url, paramsMap, null, callBack);}/*** post请求,可以传递参数* @param url:url* @param paramsMap:map集合,封装键值对参数* @param headerMap:map集合,封装请求头键值对* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。*/public static void okHttpPut(String url, Map<String, String> paramsMap, Map<String, String> headerMap, CallBackUtil callBack) {new RequestUtil(METHOD_PUT, url, paramsMap, headerMap, callBack).execute();}/*** post请求* @param url:url* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。*/public static void okHttpDelete(String url, CallBackUtil callBack) {okHttpDelete(url, null, callBack);}/*** post请求,可以传递参数* @param url:url* @param paramsMap:map集合,封装键值对参数* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。*/public static void okHttpDelete(String url, Map<String, String> paramsMap, CallBackUtil callBack) {okHttpDelete(url, paramsMap, null, callBack);}/*** post请求,可以传递参数* @param url:url* @param paramsMap:map集合,封装键值对参数* @param headerMap:map集合,封装请求头键值对* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。*/public static void okHttpDelete(String url, Map<String, String> paramsMap, Map<String, String> headerMap, CallBackUtil callBack) {new RequestUtil(METHOD_DELETE, url, paramsMap, headerMap, callBack).execute();}/*** post请求,可以传递参数* @param url:url* @param jsonStr:json格式的键值对参数* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。*/public static void okHttpPostJson(String url, String jsonStr, CallBackUtil callBack) {okHttpPostJson(url, jsonStr, null, callBack);}/*** post请求,可以传递参数* @param url:url* @param jsonStr:json格式的键值对参数* @param headerMap:map集合,封装请求头键值对* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。*/public static void okHttpPostJson(String url, String jsonStr, Map<String, String> headerMap, CallBackUtil callBack) {new RequestUtil(METHOD_POST, url, jsonStr, headerMap, callBack).execute();}/*** post请求,上传单个文件* @param url:url* @param file:File对象* @param fileKey:上传参数时file对应的键* @param fileType:File类型,是image,video,audio,file* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。还可以重写onProgress方法,得到上传进度*/public static void okHttpUploadFile(String url, File file, String fileKey, String fileType, CallBackUtil callBack) {okHttpUploadFile(url, file, fileKey,fileType, null, callBack);}/*** post请求,上传单个文件* @param url:url* @param file:File对象* @param fileKey:上传参数时file对应的键* @param fileType:File类型,是image,video,audio,file* @param paramsMap:map集合,封装键值对参数* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。还可以重写onProgress方法,得到上传进度*/public static void okHttpUploadFile(String url, File file, String fileKey,String fileType, Map<String, String> paramsMap, CallBackUtil callBack) {okHttpUploadFile(url, file,fileKey, fileType, paramsMap, null, callBack);}/*** post请求,上传单个文件* @param url:url* @param file:File对象* @param fileKey:上传参数时file对应的键* @param fileType:File类型,是image,video,audio,file* @param paramsMap:map集合,封装键值对参数* @param headerMap:map集合,封装请求头键值对* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。还可以重写onProgress方法,得到上传进度*/public static void okHttpUploadFile(String url, File file, String fileKey,String fileType, Map<String, String> paramsMap, Map<String, String> headerMap, CallBackUtil callBack) {new RequestUtil(METHOD_POST, url,paramsMap, file, fileKey,fileType,  headerMap, callBack).execute();}/*** post请求,上传多个文件,以list集合的形式* @param url:url* @param fileList:集合元素是File对象* @param fileKey:上传参数时fileList对应的键* @param fileType:File类型,是image,video,audio,file* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。*/public static void okHttpUploadListFile(String url, List<File> fileList, String fileKey, String fileType, CallBackUtil callBack) {okHttpUploadListFile(url,null, fileList, fileKey, fileType, callBack);}/*** post请求,上传多个文件,以list集合的形式* @param url:url* @param fileList:集合元素是File对象* @param fileKey:上传参数时fileList对应的键* @param fileType:File类型,是image,video,audio,file* @param paramsMap:map集合,封装键值对参数* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。*/public static void okHttpUploadListFile(String url, Map<String, String> paramsMap,List<File> fileList, String fileKey, String fileType,  CallBackUtil callBack) {okHttpUploadListFile(url, paramsMap,fileList, fileKey, fileType, null, callBack);}/*** post请求,上传多个文件,以list集合的形式* @param url:url* @param fileList:集合元素是File对象* @param fileKey:上传参数时fileList对应的键* @param fileType:File类型,是image,video,audio,file* @param paramsMap:map集合,封装键值对参数* @param headerMap:map集合,封装请求头键值对* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。*/public static void okHttpUploadListFile(String url, Map<String, String> paramsMap, List<File> fileList, String fileKey, String fileType, Map<String, String> headerMap, CallBackUtil callBack) {new RequestUtil(METHOD_POST, url,  paramsMap,fileList, fileKey, fileType, headerMap, callBack).execute();}/*** post请求,上传多个文件,以map集合的形式* @param url:url* @param fileMap:集合key是File对象对应的键,集合value是File对象* @param fileType:File类型,是image,video,audio,file* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。*/public static void okHttpUploadMapFile(String url, Map<String, File> fileMap, String fileType, CallBackUtil callBack) {okHttpUploadMapFile(url, fileMap, fileType, null, callBack);}/*** post请求,上传多个文件,以map集合的形式* @param url:url* @param fileMap:集合key是File对象对应的键,集合value是File对象* @param fileType:File类型,是image,video,audio,file* @param paramsMap:map集合,封装键值对参数* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。*/public static void okHttpUploadMapFile(String url, Map<String, File> fileMap, String fileType, Map<String, String> paramsMap, CallBackUtil callBack) {okHttpUploadMapFile(url, fileMap, fileType, paramsMap, null, callBack);}/*** post请求,上传多个文件,以map集合的形式* @param url:url* @param fileMap:集合key是File对象对应的键,集合value是File对象* @param fileType:File类型,是image,video,audio,file* @param paramsMap:map集合,封装键值对参数* @param headerMap:map集合,封装请求头键值对* @param callBack:回调接口,onFailure方法在请求失败时调用,onResponse方法在请求成功后调用,这两个方法都执行在UI线程。*/public static void okHttpUploadMapFile(String url, Map<String, File> fileMap, String fileType, Map<String, String> paramsMap, Map<String, String> headerMap, CallBackUtil callBack) {new RequestUtil(METHOD_POST, url,paramsMap, fileMap, fileType,  headerMap, callBack).execute();}/*** 下载文件,不带参数*/public static void okHttpDownloadFile(String url,CallBackUtil.CallBackFile callBack) {okHttpDownloadFile(url,null,callBack);}/*** 下载文件,带参数*/public static void okHttpDownloadFile(String url,Map<String, String> paramsMap,  CallBackUtil.CallBackFile callBack) {okHttpGet(url, paramsMap, null, callBack);}/*** 加载图片*/public static void okHttpGetBitmap(String url, CallBackUtil.CallBackBitmap callBack) {okHttpGetBitmap(url, null, callBack);}/*** 加载图片,带参数*/public static void okHttpGetBitmap(String url,Map<String, String> paramsMap,  CallBackUtil.CallBackBitmap callBack) {okHttpGet(url, paramsMap, null, callBack);}}

3、请求结果

    

设置超时

/*** 设置连接超时时间*/
public final static int CONNECT_TIMEOUT = 60;
/*** 设置读取超时时间*/
public final static int READ_TIMEOUT = 100;
/*** 设置写的超时时间*/
public final static int WRITE_TIMEOUT = 60;

private OkHttpClient mOkHttpClient;//OKhttpClient对象
mOkHttpClient = new OkHttpClient.Builder().connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS)//设置连接超时时间.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)//设置读取超时时间.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS)//设置写的超时时间.build();

2、okgo使用实例——非常简洁

public APIClient apiClient = APIClient.getApiClient();
/*** 1,校验&添加设备* 设备不存在-添加并返回成功  设备存在-返回成功*/
private void addOrCheck() {apiClient.post(new APIParams.Builder().pathUrl(Urls.ADDORCHECK).param("deviceNo", App.mDevID).callback(new AbsAPICallback<AddOrCheckBean>() {@Overrideprotected void onSuccess(String subCode, String msg, AddOrCheckBean data) {LogPlus.e("校验或添加成功  cabinetNum = " + data.cabinetNum);App.mGridNum = data.cabinetNum;queryDevInfo();}}).build());}

返回结果

APIParams    APIClient
public Map getParamsMap(){return paramMap;
}
.params(params.getParamsMap(), false)
private static Gson mGSon;
public static String parseObjToJsonStr(Object srcObj) {String result = "";if (mGSon == null) {mGSon = new GsonBuilder().disableHtmlEscaping().create();}try {result = mGSon.toJson(srcObj);} catch (Exception e) {Log.getStackTraceString(e);}return result;
}

APIResponseCallback
 params.callback.onSuccess(response.body().code, responseInfo, null);

demo云盘链接: 百度网盘 请输入提取码

密码在线回复:QQ1085220040

OKhttpdemo链接:Android开发okhttp网络请求使用demo,包括上传文件方法封装-Android代码类资源-CSDN下载

okgo使用demo:Android开发HTTP使用okgo请求数据的实现demo_okgo同步请求-Android文档类资源-CSDN下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

@ResponseBody ResponseEntity

ResponseBody ResponseEntity 1、产生疑问 我们知道&#xff0c;如果在 Controller 的某个方法上加上 ResponseBody 注解&#xff0c;那么你就能拿到 json 数据。 如果你只是知道这么用&#xff0c;那么你应该知道 ResponseBody 的具体作用&#xff1a; 其将方法的返回值通过…

22图的遍历

图的遍历 图的遍历&#xff1a;搜索属于图的基本运算。树的先序遍历和按层遍历的推广。图的遍历也称搜索&#xff0c;主要有&#xff1a; 先深搜索&#xff08;depth-first search&#xff09;——深度优先搜索——dfs搜索 先广搜索&#xff08;breadth-first search&#xff0…

Cannot resolve symbol 'R',Failed to resolve: constraint-layout

1、当在github上下载demo项目在Android studio启动时&#xff0c;提示Cannot resolve symbol R。虽然提示错误&#xff0c;但是运行项目并没有问题 原因是gradle版本高于本地Android studio的gradle版本 把 classpath com.android.tools.build:gradle:3.3.1 改为 classpat…

Android Log工具类,Toast工具类,获取当前方法名称

Log新晋工具方法 public class LgqLog {private static boolean ifShowtrue;private static int sCurrentLogLevel Log.DEBUG;private static String sPrefix null;IntDef({ Log.VERBOSE, Log.DEBUG, Log.INFO, Log.WARN, Log.ERROR })Retention(RetentionPolicy.SOURCE)publ…

前端学习(2739):重读vue电商网站49之第三方库使用CDN

通过 externals 加载外部 CDN 资源 默认情况下&#xff0c;通过 import 语法导入的第三方依赖包&#xff0c;最终会被打包合并到同一个文件中&#xff0c;从而导致打包成功后&#xff0c;单文件体积过大的问题。 例如上述 chunk-vendors.js 体积很大&#xff0c;原因是全部 im…

Mysql--重点1

知识预览 sql语句规范数据类型数据库操作数据表操作表记录操作查询表记录(select)多表查询完整性约束回到顶部sql语句规范 sql是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集&#xff0c;是一种功能齐全的数据库语言。 在使用它时&…

6、jeecg 笔记之 自定义excel 模板导出(一)

6、jeecg 笔记之 自定义excel 模板导出&#xff08;一&#xff09; 1、前言 jeecg 中已经自带 excel 的导出导出功能&#xff0c;其所使用的是 easypoi&#xff0c;尽管所导出的 excel 能满足大部分需求&#xff0c; 但总是有需要用到自定义 excel 导出模板&#xff0c;下文所…

Android Lambda 表达式使用实例,-

1、Lambda表达式理解 Lambda 表达式&#xff0c;也可称为闭包&#xff0c;它是推动 Java 8 发布的最重要新特性。 Lambda 允许把函数作为一个方法的参数&#xff08;函数作为参数传递进方法中&#xff09;。 使用Lambda 表达式可以使代码变的更加简洁紧凑。 2、Lambda表达式…

前端学习(2740):重读vue电商网站50之Element-UI 组件按需加载

通过 CDN 优化 ElementUI 的打包 虽然在开发阶段&#xff0c;我们启用了 element-ui 组件的按需加载&#xff0c;尽可能的减少了打包的体积&#xff0c;但是那些被按需加载的组件&#xff0c;还是占用了较大的文件体积。此时&#xff0c;我们可以将 element-ui 中的组件&#…

8、jeecg 笔记之 自定义word 模板导出(一)

8、jeecg 笔记之 自定义word 模板导出&#xff08;一&#xff09; 1、前言 jeecg 中已经自带 word 的导出导出功能&#xff0c;其所使用的也是 easypoi&#xff0c;尽管所导出的 word 能满足大部分需求&#xff0c; 但总是有需要用到自定义 word导出模板&#xff0c;下文所用到…

Android 全屏抽屉fragment,NavigationView

1、首先是右→左进入动画 、slide_left.xml <?xml version"1.0" encoding"utf-8"?> <set xmlns:android"http://schemas.android.com/apk/res/android"><translateandroid:duration"800"android:fromXDelta"20…

Eclipse 创建第一个 springboot 应用

Eclipse 创建第一个 springboot 应用 1、前言 一直想把笔记整理出来&#xff0c;分享一下 springboot 的搭建&#xff1b; 因为私下 idea 用的比较多&#xff0c;使用比较方便&#xff0c;但恰逢小伙伴问起 eclipse 怎么搭建的问题&#xff0c; 顾整理以记之。 2、springboot …

Can't process attribute android:fillColor=@color/gray,添加vector属性报错解决方法

Android studio添加vector属性文件报错 vector属性文件 <vector xmlns:android"http://schemas.android.com/apk/res/android"android:width"24dp"android:height"24dp"android:viewportHeight"49.94"android:viewportWidth"4…

前端学习(2742):重读vue电商网站52之路由懒加载

当打包构建项目时&#xff0c;JavaScript 包会变得非常大&#xff0c;影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块&#xff0c;然后当路由被访问的时候才加载对应组件&#xff0c;这样就更加高效了。 具体需要 3 步&#xff1a; 安装 babel/plugin-synt…

Android Service与IntentService区别

相同点&#xff1a; 1、首先Service与IntentService都是Android的基本组件service 2、使用时都是一样需要创建&#xff0c;配置&#xff1b;和调用启动方式都是一样的 不同点&#xff1a; 1、IntentService是继承自Service的service 类&#xff0c;创建了自己的特有方法onH…

前端学习(2743):重读vue电商网站53之项目上线

通过 node 创建 web 服务器。开启 gzip 配置。配置 https 服务。使用 pm2 管理应用。 通过 node 创建 web 服务器 创建 node 项目&#xff0c;并安装 express&#xff0c;通过 express 快速创建 web 服务器&#xff0c;将 vue 打包生成的 dist 文件夹&#xff0c;托管为静态资…

记录请求的耗时(拦截器、过滤器、aspect)

记录请求的耗时&#xff08;拦截器、过滤器、aspect&#xff09; 文章前言 记录控制器请求的耗时处理通常有三种实现方式&#xff0c;分别是&#xff1a;过滤器、拦截器、aspect&#xff1b;下文将逐一实现。 1、Filter 过滤器 1.1、方法说明 需要实现 Filter 类&#xff0c;主…

7、Flutter banner_view 轮播图的使用

7、Flutter banner_view 轮播图的使用 1、前言 实现轮播图&#xff0c;效果如下&#xff1a; 2、实现 将采用 banner_view 实现&#xff1a;资源库地址 2.1、yaml 引入依赖 在 pubspec.yaml 声明需要引用的库&#xff0c;执行命令 flutter packages get 进行拉取即可使用。 ba…

Android 人脸实名验证demo——腾讯人脸核身·云智慧眼

可以说比较容易实现&#xff1a;只需要获取BizToken&#xff0c;再起调腾讯SDK即可 1、首先登录腾讯云平台&#xff0c;申请权限&#xff0c;创建应用 腾讯云&#xff1a; https://cloud.tencent.com/ 2、配置应用信息及实名验证流程设置&#xff0c;下载SDK 不过&#xff0c;…

[JSOI 2015] 子集选取

4475: [Jsoi2015]子集选取 Time Limit: 1 Sec Memory Limit: 512 MBSubmit: 363 Solved: 255[Submit][Status][Discuss]Description Input 输入包含一行两个整数N和K&#xff0c;1<N,K<10^9 Output 一行一个整数&#xff0c;表示不同方案数目模1,000,000,007的值。 Sam…