Retrofit现在大家基本都用过,它不做网络请求,只负责生成网络请求的对象,网络请求交由OkHttp去完成。 一、Retrofit2的基本使用 1、引用
implementation'com.squareup.retrofit2:retrofit:2.3.0'
implementation'com.squareup.retrofit2:retrofit-converters:2.3.0'
implementation'com.squareup.retrofit2:retrofit-adapters:2.3.0'
如需要搭配gson,rxjava等同时使用,就继续添加相关引用
implementation'com'com.squareup.retrofit2:converter-gson:2.3.0'
implementation'com'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
2、定义接口
public interface NewsApi {
/**
* 获取首页的新闻列表
*
* @param map
*/
@FormUrlEncoded
@POST("api.php?s=/News/getNewsListCache")
Call getNewsList(@FieldMap() Map map);
上边的接口函数getNewsList中定义了请求方式(POST)、URL(“api.php?s=/News/getNewsListCache”)、返回值类型( Observable>)、请求参数(map)。 3、生成retrofit对象
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(FastJsonConverter.create())
.build();
生成retrofit对象时,我们可以在过程中添加json转换器等 4、生成网络请求对象
NewsApi newsApiService = retrofit.create(NewsApi.class)//生成接口实例对象
Call callWorker = newsApiService.getNewsList(map)//生成网络请求对象
首先通过create方法生成接口实例对象,然后生成网络请求对象。 5、执行网络请求
callWorker.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {...}
@Override
public void onFailure(Call call, Throwable t) {...}
});
二、生成网络请求对象原理 retrofit的作用就是生成网络请求对象,那么我们来重点看一下,它是如何生成这个对象的
NewsApi newsApiService = retrofit.create(NewsApi.class)//生成接口实例对象
生成接口实例对象时,调用了retrofit的create方法,我们点进去看一下源码
public T create(final Class service) {
Utils.validateServiceInterface(service);//判断service是否合法
if (validateEagerly) {//判断是否是提前解析这个接口
eagerlyValidateMethods(service);
}
//通过动态代理,返回转换后的接口函数中定义的返回值类型对象
return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class[] { service },
new InvocationHandler() {
private final Platform platform = Platform.get();
@Override public Object invoke(Object proxy, Method method, @Nullable Object[] args)
throws Throwable {
// If the method is a method from Object then defer to normal invocation.
if (method.getDeclaringClass() == Object.class) {
return method.invoke(this, args);
}
if (platform.isDefaultMethod(method)) {
return platform.invokeDefaultMethod(method, service, proxy, args);
}
ServiceMethod serviceMethod =
(ServiceMethod) loadServiceMethod(method);
OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);
return serviceMethod.callAdapter.adapt(okHttpCall);
}
});
}
在上边的方法中,最终要的就是动态代理中,通过InvocationHandler处理的以下三行代码
(1) ServiceMethod serviceMethod =
(ServiceMethod) loadServiceMethod(method);
(2) OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);
(3)return serviceMethod.callAdapter.adapt(okHttpCall);
代码(1)中生成了一个ServiceMethod类型对象,这个ServiceMethod是什么呢?ServiceMethod类包含了我们进行网络请求的所有基本信息,那么这个loadServiceMethod方法做了什么操作返回的ServiceMethod对象呢?
ServiceMethod loadServiceMethod(Method method) {
ServiceMethod result = serviceMethodCache.get(method);
if (result != null) return result;
synchronized (serviceMethodCache) {
result = serviceMethodCache.get(method);
if (result == null) {
result = new ServiceMethod.Builder<>(this, method).build();
serviceMethodCache.put(method, result);
}
}
return result;
}
代码很简单,其中serviceMethodCache是一个ConcurrentHashMap,用于存储ServiceMethod,通过查找serviceMethodCache中是否已经存储了相关ServiceMethod对象,如果有则返回,没有就生成新的,并将其存入serviceMethodCache中。 好了,现在我们知道(1)代码中得到了一个包含网络请求信息的对象,看看(2)中做了什么
(2) OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);
第二句代码生成了一个OkHttpCall对象,那这个OkHttpCall对象就是OkHttpClient框架中的网络请求执行对象吗?当然不是,为了尽可能的与OkHttpClient解耦,retrofit此处所生成的OkHttpCall,是其内部自定义的实现了retrofit2.Call接口的OkHttpCall,然后在(3)中通过adapter转换器,将这个OkHttpCall转换成我们需要的返回值类型。
(3)return serviceMethod.callAdapter.adapt(okHttpCall);
通过ServiceMethod中的callAdapter对象的adapt方法,对上边生成的okHttpCall进行转换,我们来看一下这个callAdapter,进入ServiceMethod类,找到这个callAdapter
CallAdapter callAdapter;
public ServiceMethod build() {
callAdapter = createCallAdapter();
...
...
}
private CallAdapter createCallAdapter() {
...
...
return (CallAdapter) retrofit.callAdapter(returnType, annotations);
}
又回到了retrofit中
public CallAdapter callAdapter(Type returnType, Annotation[] annotations) {
return nextCallAdapter(null, returnType, annotations);
}
public CallAdapter nextCallAdapter(@Nullable CallAdapter.Factory skipPast, Type returnType,
Annotation[] annotations) {
int start = adapterFactories.indexOf(skipPast) + 1;
for (int i = start, count = adapterFactories.size(); i < count; i++) {
CallAdapter adapter = adapterFactories.get(i).get(returnType, annotations, this);
if (adapter != null) {
return adapter;
}
}
...
...
}
现在我们看到了,callAdapter就是在这个方法中通过遍历adapterFactories返回的,那adapterFactories又是个什么鬼呢?
final List adapterFactories;
Retrofit(okhttp3.Call.Factory callFactory, HttpUrl baseUrl,
List converterFactories, List adapterFactories,
@Nullable Executor callbackExecutor, boolean validateEagerly) {
this.callFactory = callFactory;
this.baseUrl = baseUrl;
this.converterFactories = unmodifiableList(converterFactories); // Defensive copy at call site.
this.adapterFactories = unmodifiableList(adapterFactories); // Defensive copy at call site.
this.callbackExecutor = callbackExecutor;
this.validateEagerly = validateEagerly;
}
原来它是在Retrofit构造方法中传递进来的一个内部为CallAdapter.Factory类型的list,这回清楚了,原来当初构建的时候传递进来的adapter构造器是什么,就会根据该构造器的内部逻辑,对返回值类型进行转换,不过话又说回来了,我们在没有调用addCallAdapterFactory进行传递的时候貌似也可以正常进行啊,我们来看一下Retrofit的build方法
public Retrofit build() {
if (baseUrl == null) {
throw new IllegalStateException("Base URL required.");
}
okhttp3.Call.Factory callFactory = this.callFactory;
if (callFactory == null) {
callFactory = new OkHttpClient();
}
Executor callbackExecutor = this.callbackExecutor;
if (callbackExecutor == null) {
callbackExecutor = platform.defaultCallbackExecutor();
}
// Make a defensive copy of the adapters and add the default Call adapter.
List adapterFactories = new ArrayList<>(this.adapterFactories);
adapterFactories.add(platform.defaultCallAdapterFactory(callbackExecutor));
// Make a defensive copy of the converters.
List converterFactories = new ArrayList<>(this.converterFactories);
return new Retrofit(callFactory, baseUrl, converterFactories, adapterFactories,
callbackExecutor, validateEagerly);
}
在这里,我们看到了这样两行代码
List adapterFactories = new ArrayList<>(this.adapterFactories);
adapterFactories.add(platform.defaultCallAdapterFactory(callbackExecutor));
原来Retrofit在创建的时候自动为我们添加了一个默认的AdapterFactory,同时,我们还注意到
okhttp3.Call.Factory callFactory = this.callFactory;
if (callFactory == null) {
callFactory = new OkHttpClient();
}
就是说如果我们在构建retrofit对象的时候,如果没有主动调用client方法去添加OkHttpClient,那么Retrofit会贴心的为我们创建一个默认的OkHttpClient,当然,如果你想要自己对OkHttpClient进行一些自定义设置,就需要手动来添加了。
接下来问题又来了,CallAdapter中的adapter到底是怎么进行类型转换的呢,在这里,我们首先来看一下Retrofit给我们添加的默认的CallAdapter如何进行转换的
进入Platform类中的defaultCallAdapterFactory方法
CallAdapter.Factory defaultCallAdapterFactory(@Nullable Executor callbackExecutor) {
if (callbackExecutor != null) {
return new ExecutorCallAdapterFactory(callbackExecutor);
}
return DefaultCallAdapterFactory.INSTANCE;
}
进入DefaultCallAdapterFactory类中,代码只有几行
final class DefaultCallAdapterFactory extends CallAdapter.Factory {
static final CallAdapter.Factory INSTANCE = new DefaultCallAdapterFactory();
@Override
public CallAdapter get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
if (getRawType(returnType) != Call.class) {
return null;
}
final Type responseType = Utils.getCallResponseType(returnType);
return new CallAdapter>() {
@Override public Type responseType() {
return responseType;
}
@Override public Call adapt(Call call) {
return call;
}
};
}
}
在上边的get中我们看到,返回的CallAdapter的adapt方法中,直接将传递进来的Call对象返回,并没有做任何处理,好吧,白给的确实不能要求人家做太多东西。
那如果我们自己手动添加CallAdapterFactory呢?先来看一下与不添加时候的使用区别。 在开始的时候,我们知道,在生成了网络请求对象callWorker之后,我们主动通过调用enqueue方法,执行了网络请求(此处不再详细说明请求过程,感兴趣的同学可自行查看源码);那么如果我们在创建retrofit对象时添加了RxJava2CallAdapterFactory呢?
retrofit.create(NewsApi.class)
.getNewsBanner(map)
.map(new HttpFunction<>())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(NewsBean value) {
}
@Override
public void onError(Throwable t) {
}
});
为什么这时候不需要再调用enqueue或者execute方法来执行网络请求,而是只要等结果就可以了呢? 这个RxJava2CallAdapterFactory一定有什么猫腻,我们来看一下这个类到底做了什么。
@Override
public CallAdapter get(Type returnType, Annotation[] annotations, Retrofit retrofit) {
...
...
return new RxJava2CallAdapter(responseType, scheduler, isResult, isBody, isFlowable,
isSingle, isMaybe, false);
}
进入RxJava2CallAdapter类
@Override public Object adapt(Call call) {
Observable> responseObservable = new CallObservable<>(call);
Observable observable;
if (isResult) {
observable = new ResultObservable<>(responseObservable);
} else if (isBody) {
observable = new BodyObservable<>(responseObservable);
} else {
observable = responseObservable;
}
if (scheduler != null) {
observable = observable.subscribeOn(scheduler);
}
if (isFlowable) {
return observable.toFlowable(BackpressureStrategy.LATEST);
}
if (isSingle) {
return observable.singleOrError();
}
if (isMaybe) {
return observable.singleElement();
}
if (isCompletable) {
return observable.ignoreElements();
}
return observable;
}
这里,我们看到,call被转换成了我们在配合RxJava2CallAdapterFactory使用的时候得到的Observable类型,那么这个转换过程是什么样的呢?
进入CallObservable类
final class CallObservable extends Observable> {
private final Call originalCall;
CallObservable(Call originalCall) {
this.originalCall = originalCall;
}
@Override protected void subscribeActual(Observer> observer) {
// Since Call is a one-shot type, clone it for each new observer.
Call call = originalCall.clone();
observer.onSubscribe(new CallDisposable(call));
boolean terminated = false;
try {
Response response = call.execute();
if (!call.isCanceled()) {
observer.onNext(response);
}
if (!call.isCanceled()) {
terminated = true;
observer.onComplete();
}
} catch (Throwable t) {
Exceptions.throwIfFatal(t);
if (terminated) {
RxJavaPlugins.onError(t);
} else if (!call.isCanceled()) {
try {
observer.onError(t);
} catch (Throwable inner) {
Exceptions.throwIfFatal(inner);
RxJavaPlugins.onError(new CompositeException(t, inner));
}
}
}
}
在这里我们看到了这么一句代码
Response response = call.execute();
原来RxJava2CallAdapterFactory所生成的CallAdapter,不仅仅帮助我们将返回类型由Call转换成了Observable,还在过程中执行了 call.execute()也就是网络请求动作,怪不得我们使用RxJava2CallAdapterFactory的时候不需要自己手动执行网络请求。
好了,到这里Retrofit2的功能原理我们大概就了解了,主要就是生成了一个网络请求对像,然后我们通过操作这个对象来执行网络请求,并得到我们所期望的返回值类型。
你可能感兴趣的:(Retrofit2原理简介)
过拟合:机器学习中的“死记硬背”陷阱
彩旗工作室
人工智能 机器学习 人工智能
在机器学习中,过拟合(Overfitting)是一个几乎每个从业者都会遇到的经典问题。它像一把双刃剑:当模型过于“聪明”时,可能会陷入对训练数据的过度依赖,从而失去处理新问题的能力。本文将从原理到实践,深入探讨过拟合的本质及应对策略。1.什么是过拟合?过拟合是指模型在训练数据上表现极佳,但在新数据(测试数据或真实场景数据)上表现显著下降的现象。通俗来说,模型像一个“死记硬背的学生”,记住了训练集中
MobileNet家族:从v1到v4的架构演进与发展历程
彩旗工作室
人工智能 架构 人工智能 机器学习 cnn 卷积神经网络
MobileNet是一个专为移动设备和嵌入式系统设计的轻量化卷积神经网络(CNN)家族,旨在在资源受限的环境中实现高效的图像分类、对象检测和语义分割等任务。自2017年首次推出以来,MobileNet经历了从v1到v4的多次迭代,每一代都在计算效率、模型大小和准确性上取得了显著进步。本文将详细探讨MobileNetv1、v2、v3和v4的原理、架构设计及其发展历程,并分析其关键创新和性能表现。Mo
Adaptive AUTOSAR之状态管理模块(STM)
weixin_42130902
Adaptive AUTOSAR 架构
1.STM简介状态管理(STM)负责根据从其他AUTOSAR自适应平台应用程序或自适应应用程序接收的信息确定其任何内部状态机的状态。STM使用提供的网络管理字段(NetworkHandle)控制(部分网络)的状态。STM与执行管理(EXM)交互,以请求功能组和机器状态,以输入由项目需求确定的特定状态。功能组状态可能还依赖于网络管理(NM)状态。STM通过ara::com服务提供对其内部状态的访问。
Adaptive AUTOSAR之诊断模块(DIA)
weixin_42130902
Adaptive AUTOSAR 车载系统
ara::dia简介ara::dia模块是ARA(AUTOSARRuntimeforAdaptiveApplications)中的一个关键模块,用于诊断和故障管理。它提供了一系列功能和服务,帮助开发人员进行故障诊断和故障管理,以确保系统的可靠性和稳定性。ara::dia模块包括以下子模块和服务:ara::com:用于通信的模块,支持诊断通信和故障管理通信。ara::diag:用于故障诊断的模块,提
Vue CLI 构建移动端购物商城实战
凌莫凡
本文还有配套的精品资源,点击获取简介:本项目通过VueCLI创建一个针对移动端的电商应用,目的是帮助开发者快速构建一个功能齐全、性能优良的在线购物平台。文章详细解析了Vue.js基础、VueCLI3的项目配置、组件化开发、Vuex状态管理、VueRouter路由管理、移动端适配、热重载与开发服务器配置,以及生产环境优化等关键知识点,对于提升Vue.js技能和项目实战经验具有重要价值。1.Vue.j
云科技网络验证源码_黑科技网络验证软件 1.52.0.0免费版
盲眼刺客
云科技网络验证源码
黑科技网络验证是一款最新的网络验证系统,一键成品EXE文件或者程序加密加壳,永久免费使用,让大家开发的EXE产品不被滥用,从而更好地利用和维护开发的EXE程序,内置三种验证模式,安全性很高,有需要的朋友欢迎使用。黑科技网络验证软件软件简介:黑科技网络验证是一款支持任意成品EXE加密完整的网络验证系统主要功能是让其实现收费授权功能。使你的软件实现:登录、zc、充值、收费等功能。软件功能:软件加密不限
面向服务的诊断 SOVD(Service-Oriented Vehicle Diagnostics)AUTOSAR AP R24-11
aFakeProgramer
AP AUTOSAR # AP AUTOSAR 新标准解读系列 AUTOSAR SOVD
AUTOSAR_AP_EXP_SOVD导读:ASAMSOVD与AUTOSAR自适应平台的集成ASAMSOVD简介:ASAMSOVD(面向服务的车辆诊断)是一个较新的诊断标准,旨在解决当前诊断协议(如UDS)面临的挑战。SOVD是一个自我解释的协议,不依赖于外部ODX数据描述,使用现代技术(如HTTPS)实现。它支持远程、接近和车内诊断用例,并包含UDS作为子集,同时支持HPC用例。SOVD与AUT
方舟字节码原理剖析:架构、特性与实践应用
轻口味
HarmonyOS Next harmonyos 深度学习 pytorch harmonyosnext arkts
方舟字节码原理剖析:架构、特性与实践应用一、引言在当今软件行业高速发展的大背景下,应用程序的性能、开发效率以及跨平台兼容性成为了开发者们关注的核心要素。编译器作为软件开发流程中的关键工具,其性能和特性直接影响着软件的质量和开发周期。华为推出的方舟编译器正是为了满足这些需求而诞生的创新成果。方舟字节码(ArkBytecode)作为方舟编译器的核心产物,在整个编译和运行过程中扮演着至关重要的角色。它不
RSA加密算法详解:从基础原理到实际应用
冬停
算法
RSA加密算法详解:从基础原理到实际应用在现代信息安全领域,RSA加密算法因其坚实的数学基础和广泛的应用而备受关注。本文将全面介绍RSA算法的原理、密钥生成、加密解密过程以及数字签名的实现,并通过Python示例代码帮助您深入理解和掌握RSA的实际应用。目录什么是RSA?RSA的基本原理RSA密钥生成RSA加密与解密RSA签名与验证RSA的安全性Python实现RSA7.1RSA密钥生成示例7.2
【Python】已解决:pip安装第三方模块(库)与PyCharm中不同步的问题(PyCharm添加本地python解释器)
屿小夏
python pip pycharm
个人简介:某不知名博主,致力于全栈领域的优质博客分享|用最优质的内容带来最舒适的阅读体验!文末获取免费IT学习资料!文末获取更多信息精彩专栏推荐订阅收藏专栏系列直达链接相关介绍书籍分享点我跳转书籍作为获取知识的重要途径,对于IT从业者来说更是不可或缺的资源。不定期更新IT图书,并在评论区抽取随机粉丝,书籍免费包邮到家AI前沿点我跳转探讨人工智能技术领域的最新发展和创新,涵盖机器学习、深度学习、自然
使用Python实现无人机路径规划的灰狼优化算法
闲人编程
python python 无人机 算法 灰狼优化 路径规划
目录使用Python实现无人机路径规划的灰狼优化算法引言1.灰狼优化算法概述1.1定义1.2算法原理1.3灰狼的狩猎策略1.4算法步骤2.Python中的灰狼优化算法实现2.1安装必要的库2.2定义类2.2.1灰狼类2.2.2群体类2.2.3路径规划类2.3示例程序3.灰狼优化算法的优缺点3.1优点3.2缺点4.改进方向5.应用场景结论使用Python实现无人机路径规划的灰狼优化算法引言无人机的路
html css 笔记
小箌
html css 笔记
01_浏览器相关知识五大主流浏览器:ChromeSafariIEFirefoxOpera(拥有自己的内核)四大内核:webkitTridentGeckoblink.02_网页相关知识构成网址网站网页网页标准:结构表现行为分别对应HTMLCSSJavaScript03_HTML简介HTML是什么译为:标记语言超文本:比普通的文本信息含量更多04_HTML初体验保存:Ctrl+S后缀:.html程序员
使用二进制位运算,代替十进制乘法(除法)运算
真相很简单
编程环境 嵌入式 其他 乘法运算 位运算 二进制 10进制 高效
文章目录乘法原理十进制分解程序示例运算结果除法原理十进制分解程序示例运算结果 在嵌入式环境中虽然有乘法运算器,而且芯片运算速度越来越快,但位运算还是最快速的,为了提高计算效率,可以将乘法运算使用位运算替换。乘法原理 若被乘数是2的整数倍,可以直接进行左移运算,这个比较简单,本文解释下当被乘数不是2的整数倍的情况,乘法进行位运算替换的基本原理,分两步因式分解:A∗(B+C)=A∗B+A∗CA*(
【AWS入门】AWS云计算简介
Jackson@ML
aws 亚马逊云科技 云计算 云计算 aws 亚马逊云科技
【AWS入门】AWS云计算简介ABriefIntroductiontoAWSCloudComputingByJackson@ML什么是云计算?云计算能干什么?我们如何利用云计算?云计算如何实现?带着一系列问题,我将做一个普通布道者,引领广大读者,针对AWS各项云技术和服务,逐步进入云计算赋能千行百业的神奇世界。本文简要介绍AWS提供的云计算,希望对读者有所帮助。1.云计算云计算通过互联网按需提供I
Python实现大麦网抢票的四大关键技术点解析
小白学大数据
亿牛云代理 python python 开发语言 爬虫 数据挖掘 程序人生
前言随着互联网的普及和发展,线上购票已经成为人们生活中不可或缺的一部分。然而,在抢购热门演出门票时,往往会遇到抢票难、抢票快的问题,有时候一秒钟的延迟就意味着与心仪的演出擦肩而过。为了解决这个问题,技术爱好者们开始探索利用Python多线程技术来提高抢票效率。本文将介绍Python实现大麦网抢票的四大关键技术点,帮助读者了解抢票脚本的核心原理,并通过示例代码详细说明实现过程。1.网页解析技术大麦网
使用 Python 爬取高德地图交通数据并进行数据分析(完整教程)
Python爬虫项目
python 数据分析 数据库 selenium 爬虫 开发语言 beautifulsoup
一、引言在现代交通系统中,交通数据是进行智能交通管理、交通流量预测和交通规划的重要依据。高德地图(Amap)作为国内最权威的地理和交通信息平台之一,提供了丰富的开放API,允许开发者访问包括实时交通路况、路线规划、地理编码等各种数据。本教程将使用Python构建一个完整的爬虫程序,调用高德地图API,解析和存储交通数据,并通过数据分析和可视化深入挖掘交通流量特征。二、高德地图API简介2.1高德地
C++设计模式-原型模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
牵牛老人
C++专栏 c++ 设计模式 原型模式
一、基本介绍:理解"克隆"的设计哲学1.1什么是原型模式原型模式(PrototypePattern)是一种创建型设计模式,其核心思想是通过复制现有对象来创建新对象,而非传统的新建实例方式。如同生物学的细胞分裂机制,原型对象作为"母体",通过自我复制产生完全相同的新个体。该模式在C++中通常借助拷贝构造函数或克隆接口实现,特别适用于以下场景:对象初始化成本高昂(如需要读取大文件);系统需要动态生成多
算法篇——二分查找
古月方源1.0版
算法 算法
二分查找:从理论到实践前言今天无聊,决定在CSDN上发布我的第一篇文章,与大家分享一下二分查找算法。二分查找是一种高效的在有序数组中查找特定元素的算法,其核心思想是通过反复将查找范围减半来快速定位目标元素。二分查找的基本原理二分查找的基本思想非常简单。每次查找时,将数组的中间元素与目标值进行比较:如果中间元素等于目标值,则查找成功。如果中间元素小于目标值,则目标值只可能在右半部分,查找范围缩小为右
CIFAR-10 数据集的简介
一头大学牲
python 深度学习 机器学习 数据分析
文章目录CIFAR-10数据集的简介文件结构图像数据结构访问数据Python代码CIFAR-10数据集的数据格式CIFAR-10数据集的简介CIFAR-10数据集是一个广泛使用的图像数据集,具体可见CIFAR-10和CIFAR-100数据集,它包含60,000张32x32像素的彩色(3channels)图像,分为10个类别,每个类别有6,000张图像。每个类别的图像数量分布如下:飞机(airpla
(Java)Scanner 类
南淮北安
Java 学习笔记 java
文章目录一、Scanner类简介二、使用Scanner类输入数据1.实现基本的数据输入2.实现日期格式的数据输入3.从文件中得到数据一、Scanner类简介Scanner类的常用方法:Scanner类提供了一个可以接收InputStream类型的构造方法,这就表示只要是字节输入流的子类都可以通过Scanner类进行方便的读取二、使用Scanner类输入数据1.实现基本的数据输入importjava
【人工智能基础2】机器学习、深度学习总结
roman_日积跬步-终至千里
人工智能习题 人工智能 机器学习 深度学习
文章目录一、人工智能关键技术二、机器学习基础1.监督、无监督、半监督学习2.损失函数:四种损失函数3.泛化与交叉验证4.过拟合与欠拟合5.正则化6.支持向量机三、深度学习基础1、概念与原理2、学习方式3、多层神经网络训练方法一、人工智能关键技术领域基础原理与逻辑机器学习机器学习基于数据,研究从观测数据出发寻找规律,利用这些规律对未来数据进行预测。基于学习模式,机器学习可以分为监督、无监督、强化学习
玩转Python绘图利器——Turtle库
Ai_绘画小南
python 开发语言 信息可视化
Turtle是Python语言中的一个重要的绘图库,它提供了简单易用的绘图功能,适用于所有年龄段的程序员。本文将详细介绍Turtle库的使用方法,并给出多种实例,帮助读者快速上手。一、Turtle库简介Turtle库最早由WallyFeurzeig、SeymourPapert和CynthiaSolomon等人在1960年代末期开发,目的是为了教学和艺术创作。它利用海龟的图形来操作画笔,通过简单的指
离线安装Docker&&Docker compose(centos版本)
AosisDevDoHub
linux docker centos 容器
简介离线安装docker的两种方法本人用的压缩包安装,RPM包安装的话依赖不好找Docker与Dockercompose版本对应关于docker-composer的版本和docker-compose.yml里version的理解离线安装docker-compose一、离线安装docker的两种方法注:因为是给centos安装所以是rpm包离线安装Docker主要有两种常见方法:使用RPM包或压缩包
淘宝客劫持插件功能演示解析
喵喵蜜
本文还有配套的精品资源,点击获取简介:淘宝客劫持插件通过改变用户购物链接为带有推广ID的链接,使推广者在用户购买后获得佣金。演示内容包括插件安装、链接转换机制、用户无感知操作、安全性与隐私、收益追踪、兼容性测试、源码说明、许可证和法律合规性,以及教程示例。该插件是一种网络营销工具,需在用户体验和合规性间找到平衡,对于推广者和浏览器扩展开发者具有实用价值。1.淘宝客劫持插件功能概述在电商行业竞争日益
MVC框架详解
大王算法
软件架构设计指南 mvc
目录一、背景二、MVC框架简介2.1、模型(Model)2.2、视图(View)2.3、控制器(Controller)三、Qt的MVC框架设计3.1、Qt中的模型(Model)3.2、Qt中的视图(View)3.3、Qt中的控制器(Controller)四、MVC架构的优缺点1、MVC的优点(1).分离关注点:(2).促进模块化:(3).代码重用:2、MVC的缺点(1).学习曲线(2).代码复杂性
清华大学《DeepSeek赋能家庭教育》深度解析:AI如何重塑现代家庭教育模式
硅基打工人
AI 人工智能 经验分享 大数据 开源 语言模型
引言:家庭教育的困境与AI的破局在数字化与智能化浪潮下,家庭教育面临多重挑战:家长教育能力不足、教育资源分配不均、亲子沟通效率低下、个性化需求难以满足等。清华大学发布的《DeepSeek赋能家庭教育》系列报告(共56页)提出了一种基于人工智能的解决方案,通过深度学习平台DeepSeek,为家庭教育注入科技动能。本文将从技术原理、核心功能、应用场景、伦理安全及未来展望等多维度展开分析。一、DeepS
Adobe Firefly 技术浅析(三):GANs 的改进
爱研究的小牛
AIGC——图像 AIGC—生成对抗网络 AIGC 机器学习 深度学习
生成式对抗网络(GANs)在图像生成领域取得了显著的进展,但原始的GANs在训练稳定性、生成质量以及多样性方面存在一些挑战。AdobeFirefly在其图像生成技术中采用了多种改进的GANs方法,以提高生成图像的质量和多样性。1.条件生成式对抗网络(cGANs)1.1基本原理条件生成式对抗网络(cGANs)通过引入额外的条件信息(如类别标签、文本描述等),使得生成器能够根据这些条件生成特定类型的图
第5篇:从入门到精通:深入详解Python模块与包管理的应用
猿享天开
python 开发语言
第5篇:模块与包管理目录模块概述什么是模块导入模块标准库简介创建与使用自定义模块创建模块导入自定义模块模块搜索路径包(Packages)什么是包创建包导入包中的模块常用内置模块介绍math模块datetime模块os模块sys模块模块与包的最佳实践命名规范组织结构避免循环导入示例代码常见问题及解决方法总结模块概述什么是模块模块是Python中组织代码的一种方式。一个模块就是一个包含Python定义
数据分析:数据的存储结构、数据类型、数据集成技术、存储模型、查询语言、API、驱动器等
AI天才研究院
Python实战 自然语言处理 人工智能 语言模型 编程实践 开发语言 架构设计
作者:禅与计算机程序设计艺术1.简介数据分析是一个复杂的工程,需要用到多个数据库、数据表、数据文件等数据集成资源。不同的数据集成环境(如分布式系统、异构数据库)会影响数据分析的效率和效果。在进行数据分析时,首先要确定数据集成方案、选择合适的数据模型和索引策略,以及评估各种解决方案之间的优劣。因此,掌握数据的存储结构、数据类型、数据集成技术、存储模型、查询语言、API、驱动器等关键信息对数据分析工作
SpringBoot自动配置原理及手动实现自动配置
m0_56222134
程序员 面试 java 经验分享
之前我们学习了SpringBoot中的配置文件及外部化配置,了解了SpringBoot对于配置文件的功能支持与增强,本篇我们将要来学习SpringBoot的自动配置原理及手动实现自动配置。数据库依赖引起的bug我们很多人在第一次使用SpringBoot的时候,往往对其原理认知不足,或者简单的了解以后就开始入门使用,往往最常见的就是使用SpringBoot添加一个持久化框架的依赖,用来尝试操作数据库
eclipse maven
IXHONG
eclipse
eclipse中使用maven插件的时候,运行run as maven build的时候报错
-Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match.
可以设一个环境变量M2_HOME指
timer cancel方法的一个小实例
alleni123
多线程 timer
package com.lj.timer;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class MyTimer extends TimerTask
{
private int a;
private Timer timer;
pub
MySQL数据库在Linux下的安装
ducklsl
mysql
1.建好一个专门放置MySQL的目录
/mysql/db数据库目录
/mysql/data数据库数据文件目录
2.配置用户,添加专门的MySQL管理用户
>groupadd mysql ----添加用户组
>useradd -g mysql mysql ----在mysql用户组中添加一个mysql用户
3.配置,生成并安装MySQL
>cmake -D
spring------>>cvc-elt.1: Cannot find the declaration of element
Array_06
spring bean
将--------
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3
maven发布第三方jar的一些问题
cugfy
maven
maven中发布 第三方jar到nexus仓库使用的是 deploy:deploy-file命令
有许多参数,具体可查看
http://maven.apache.org/plugins/maven-deploy-plugin/deploy-file-mojo.html
以下是一个例子:
mvn deploy:deploy-file -DgroupId=xpp3
MYSQL下载及安装
357029540
mysql
好久没有去安装过MYSQL,今天自己在安装完MYSQL过后用navicat for mysql去厕测试链接的时候出现了10061的问题,因为的的MYSQL是最新版本为5.6.24,所以下载的文件夹里没有my.ini文件,所以在网上找了很多方法还是没有找到怎么解决问题,最后看到了一篇百度经验里有这个的介绍,按照其步骤也完成了安装,在这里给大家分享下这个链接的地址
ios TableView cell的布局
张亚雄
tableview
cell.imageView.image = [UIImage imageNamed:[imageArray objectAtIndex:[indexPath row]]];
CGSize itemSize = CGSizeMake(60, 50);
&nbs
Java编码转义
adminjun
java 编码转义
import java.io.UnsupportedEncodingException;
/**
* 转换字符串的编码
*/
public class ChangeCharset {
/** 7位ASCII字符,也叫作ISO646-US、Unicode字符集的基本拉丁块 */
public static final Strin
Tomcat 配置和spring
aijuans
spring
简介
Tomcat启动时,先找系统变量CATALINA_BASE,如果没有,则找CATALINA_HOME。然后找这个变量所指的目录下的conf文件夹,从中读取配置文件。最重要的配置文件:server.xml 。要配置tomcat,基本上了解server.xml,context.xml和web.xml。
Server.xml -- tomcat主
Java打印当前目录下的所有子目录和文件
ayaoxinchao
递归 File
其实这个没啥技术含量,大湿们不要操笑哦,只是做一个简单的记录,简单用了一下递归算法。
import java.io.File;
/**
* @author Perlin
* @date 2014-6-30
*/
public class PrintDirectory {
public static void printDirectory(File f
linux安装mysql出现libs报冲突解决
BigBird2012
linux
linux安装mysql出现libs报冲突解决
安装mysql出现
file /usr/share/mysql/ukrainian/errmsg.sys from install of MySQL-server-5.5.33-1.linux2.6.i386 conflicts with file from package mysql-libs-5.1.61-4.el6.i686
jedis连接池使用实例
bijian1013
redis jedis连接池 jedis
实例代码:
package com.bijian.study;
import java.util.ArrayList;
import java.util.List;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoo
关于朋友
bingyingao
朋友 兴趣爱好 维持
成为朋友的必要条件:
志相同,道不合,可以成为朋友。譬如马云、周星驰一个是商人,一个是影星,可谓道不同,但都很有梦想,都要在各自领域里做到最好,当他们遇到一起,互相欣赏,可以畅谈两个小时。
志不同,道相合,也可以成为朋友。譬如有时候看到两个一个成绩很好每次考试争做第一,一个成绩很差的同学是好朋友。他们志向不相同,但他
【Spark七十九】Spark RDD API一
bit1129
spark
aggregate
package spark.examples.rddapi
import org.apache.spark.{SparkConf, SparkContext}
//测试RDD的aggregate方法
object AggregateTest {
def main(args: Array[String]) {
val conf = new Spar
ktap 0.1 released
bookjovi
kernel tracing
Dear,
I'm pleased to announce that ktap release v0.1, this is the first official
release of ktap project, it is expected that this release is not fully
functional or very stable and we welcome bu
能保存Properties文件注释的Properties工具类
BrokenDreams
properties
今天遇到一个小需求:由于java.util.Properties读取属性文件时会忽略注释,当写回去的时候,注释都没了。恰好一个项目中的配置文件会在部署后被某个Java程序修改一下,但修改了之后注释全没了,可能会给以后的参数调整带来困难。所以要解决这个问题。
&nb
读《研磨设计模式》-代码笔记-外观模式-Facade
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
/*
* 百度百科的定义:
* Facade(外观)模式为子系统中的各类(或结构与方法)提供一个简明一致的界面,
* 隐藏子系统的复杂性,使子系统更加容易使用。他是为子系统中的一组接口所提供的一个一致的界面
*
* 可简单地
After Effects教程收集
cherishLC
After Effects
1、中文入门
http://study.163.com/course/courseMain.htm?courseId=730009
2、videocopilot英文入门教程(中文字幕)
http://www.youku.com/playlist_show/id_17893193.html
英文原址:
http://www.videocopilot.net/basic/
素
Linux Apache 安装过程
crabdave
apache
Linux Apache 安装过程
下载新版本:
apr-1.4.2.tar.gz(下载网站:http://apr.apache.org/download.cgi)
apr-util-1.3.9.tar.gz(下载网站:http://apr.apache.org/download.cgi)
httpd-2.2.15.tar.gz(下载网站:http://httpd.apac
Shell学习 之 变量赋值和引用
daizj
shell 变量引用 赋值
本文转自:http://www.cnblogs.com/papam/articles/1548679.html
Shell编程中,使用变量无需事先声明,同时变量名的命名须遵循如下规则:
首个字符必须为字母(a-z,A-Z)
中间不能有空格,可以使用下划线(_)
不能使用标点符号
不能使用bash里的关键字(可用help命令查看保留关键字)
需要给变量赋值时,可以这么写:
Java SE 第一讲(Java SE入门、JDK的下载与安装、第一个Java程序、Java程序的编译与执行)
dcj3sjt126com
java jdk
Java SE 第一讲:
Java SE:Java Standard Edition
Java ME: Java Mobile Edition
Java EE:Java Enterprise Edition
Java是由Sun公司推出的(今年初被Oracle公司收购)。
收购价格:74亿美金
J2SE、J2ME、J2EE
JDK:Java Development
YII给用户登录加上验证码
dcj3sjt126com
yii
1、在SiteController中添加如下代码:
/**
* Declares class-based actions.
*/
public function actions() {
return array(
// captcha action renders the CAPTCHA image displ
Lucene使用说明
dyy_gusi
Lucene search 分词器
Lucene使用说明
1、lucene简介
1.1、什么是lucene
Lucene是一个全文搜索框架,而不是应用产品。因此它并不像baidu或者googleDesktop那种拿来就能用,它只是提供了一种工具让你能实现这些产品和功能。
1.2、lucene能做什么
要回答这个问题,先要了解lucene的本质。实际
学习编程并不难,做到以下几点即可!
gcq511120594
数据结构 编程 算法
不论你是想自己设计游戏,还是开发iPhone或安卓手机上的应用,还是仅仅为了娱乐,学习编程语言都是一条必经之路。编程语言种类繁多,用途各 异,然而一旦掌握其中之一,其他的也就迎刃而解。作为初学者,你可能要先从Java或HTML开始学,一旦掌握了一门编程语言,你就发挥无穷的想象,开发 各种神奇的软件啦。
1、确定目标
学习编程语言既充满乐趣,又充满挑战。有些花费多年时间学习一门编程语言的大学生到
Java面试十问之三:Java与C++内存回收机制的差别
HNUlanwei
java C++ finalize() 堆栈 内存回收
大家知道, Java 除了那 8 种基本类型以外,其他都是对象类型(又称为引用类型)的数据。 JVM 会把程序创建的对象存放在堆空间中,那什么又是堆空间呢?其实,堆( Heap)是一个运行时的数据存储区,从它可以分配大小各异的空间。一般,运行时的数据存储区有堆( Heap)和堆栈( Stack),所以要先看它们里面可以分配哪些类型的对象实体,然后才知道如何均衡使用这两种存储区。一般来说,栈中存放的
第二章 Nginx+Lua开发入门
jinnianshilongnian
nginx lua
Nginx入门
本文目的是学习Nginx+Lua开发,对于Nginx基本知识可以参考如下文章:
nginx启动、关闭、重启
http://www.cnblogs.com/derekchen/archive/2011/02/17/1957209.html
agentzh 的 Nginx 教程
http://openresty.org/download/agentzh-nginx-tutor
MongoDB windows安装 基本命令
liyonghui160com
windows安装
安装目录:
D:\MongoDB\
新建目录
D:\MongoDB\data\db
4.启动进城:
cd D:\MongoDB\bin
mongod -dbpath D:\MongoDB\data\db
&n
Linux下通过源码编译安装程序
pda158
linux
一、程序的组成部分 Linux下程序大都是由以下几部分组成: 二进制文件:也就是可以运行的程序文件 库文件:就是通常我们见到的lib目录下的文件 配置文件:这个不必多说,都知道 帮助文档:通常是我们在linux下用man命令查看的命令的文档
二、linux下程序的存放目录 linux程序的存放目录大致有三个地方: /etc, /b
WEB开发编程的职业生涯4个阶段
shw3588
编程 Web 工作 生活
觉得自己什么都会
2007年从学校毕业,凭借自己原创的ASP毕业设计,以为自己很厉害似的,信心满满去东莞找工作,找面试成功率确实很高,只是工资不高,但依旧无法磨灭那过分的自信,那时候什么考勤系统、什么OA系统、什么ERP,什么都觉得有信心,这样的生涯大概持续了约一年。
根本不是自己想的那样
2008年开始接触很多工作相关的东西,发现太多东西自己根本不会,都需要去学,不管是asp还是js,
遭遇jsonp同域下变作post请求的坑
vb2005xu
jsonp 同域post
今天迁移一个站点时遇到一个坑爹问题,同一个jsonp接口在跨域时都能调用成功,但是在同域下调用虽然成功,但是数据却有问题. 此处贴出我的后端代码片段
$mi_id = htmlspecialchars(trim($_GET['mi_id ']));
$mi_cv = htmlspecialchars(trim($_GET['mi_cv ']));
贴出我前端代码片段:
$.aj