之前在Retrofit源码初探一文中我们提出了三个问题:
什么时候开始将注解中参数拼装成http请求的信息的?
如何产生发起http请求对象的?
如何将对象转换成我们在接口中指定的返回值的?
其中前两个问题在前几篇文章已经做了解答,今天我们探究下最后一个问题:
我们定义接口时,有这样的:
@GET("hello/world")
Call getNews(@Query("num") String num,@Query("page")String page);
也有这样的:
@GET("book/search")
Observable getSearchBook(@Query("q") String name,
@Query("tag") String tag, @Query("start") int start,
@Query("count") int count);
可以看到接口的返回值是不一样的,现在我们就来分析下,一个OkHttpCall对象是如何转换成对应的返回值的。
核心代码是这句:
return serviceMethod.adapt(okHttpCall);
进到adapt中去:
T adapt(Call call) {
return callAdapter.adapt(call);
}
可以看到是调用了callAdapter.adapt方法,此处的callAdapter是一个接口类型,所以想要看它的adapt方法的具体实现就得看这个callAdapter具体怎么生成的。
经过搜索,发现它的生成方式如下:
ServiceMethod(Builder builder) {
//………………
this.callAdapter = builder.callAdapter;
//………………
}
而这个构造方法是在ServiceMethod.Builder的build方法中调用的:
public ServiceMethod build() {
callAdapter = createCallAdapter();
//…………
return new ServiceMethod<>(this);
}
所以继续跟进createCallAdapter()中去:
private CallAdapter createCallAdapter() {
Type returnType = method.getGenericReturnType();
if (Utils.hasUnresolvableType(returnType)) {
throw methodError(
"Method return type must not include a type variable or wildcard: %s", returnType);
}
if (returnType == void.class) {
throw methodError("Service methods cannot return void.");
}
Annotation[] annotations = method.getAnnotations();
try {
//noinspection unchecked
return (CallAdapter) retrofit.callAdapter(returnType, annotations);
} catch (RuntimeException e) { // Wide exception range because factories are user code.
throw methodError(e, "Unable to create call adapter for %s", returnType);
}
}
可以看到,这里的主要作用就是获取方法级别的注解以及返回值,然后传入到retrofit.callAdapter中去获取正真的CallAdapter,所以继续跟到retrofit.callAdatper中去:
public CallAdapter callAdapter(Type returnType, Annotation[] annotations) {
return nextCallAdapter(null, returnType, annotations);
}
继续进到nextCallAdapter中:
public CallAdapter nextCallAdapter(@Nullable CallAdapter.Factory skipPast, Type returnType,
Annotation[] annotations) {
checkNotNull(returnType, "returnType == null");
checkNotNull(annotations, "annotations == null");
int start = callAdapterFactories.indexOf(skipPast) + 1;
for (int i = start, count = callAdapterFactories.size(); i < count; i++) {
CallAdapter adapter = callAdapterFactories.get(i).get(returnType, annotations, this);
if (adapter != null) {
return adapter;
}
}
//省略一些不重要代码
}
这里主要就是遍历Retrofit的所有CallAdapter,然后找到能够处理该返回类型以及方法注解的那个直接返回。 对于默认返回类型的处理CallAdapter,其实是在Retrofit生成时默认加上的:
public Retrofit build() {
//省略部分代码
Executor callbackExecutor = this.callbackExecutor;
if (callbackExecutor == null) {
callbackExecutor = platform.defaultCallbackExecutor();
}
// Make a defensive copy of the adapters and add the default Call adapter.
List callAdapterFactories = new ArrayList<>(this.callAdapterFactories);
callAdapterFactories.add(platform.defaultCallAdapterFactory(callbackExecutor));
//省略部分代码
return new Retrofit(callFactory, baseUrl, unmodifiableList(converterFactories),
unmodifiableList(callAdapterFactories), callbackExecutor, validateEagerly);
}
这里有一点要事先说下,所有的CalllAdapter对象其实都是通过CallAdapter.Factory对象调用get()方法生成的。 所以这里利用platform.defaultCallAdapterFactory()生成了一个对应的CallAdapter.Factory对象,但生成这个对象首先生成了一个callbackExecutor,我们先看下它是怎么回事:
@Nullable Executor defaultCallbackExecutor() {
return null;
}
咦,为什么是返回null的?别慌,Retrofit的build中的platform根据不同的情况会是不同的子类,并不一定是Platform的实例,而是它的子类:
static class Android extends Platform {
@Override public Executor defaultCallbackExecutor() {
return new MainThreadExecutor();
}
@Override CallAdapter.Factory defaultCallAdapterFactory(@Nullable Executor callbackExecutor) {
if (callbackExecutor == null) throw new AssertionError();
return new ExecutorCallAdapterFactory(callbackExecutor);
}
static class MainThreadExecutor implements Executor {
private final Handler handler = new Handler(Looper.getMainLooper());
@Override public void execute(Runnable r) {
handler.post(r);
}
}
}
我们重点关注Android平台的,可以看到这里生成的callbackExecutor的execute()方法主要就是用来将操作发送到主线程执行。
ok,callbackExecutor我们弄清楚了,那么接下来我们继续看platform.defaultCallAdapterFactory()方法生成了什么样的CallAdapter.Factory对象:
CallAdapter.Factory defaultCallAdapterFactory(@Nullable Executor callbackExecutor) {
if (callbackExecutor != null) {
return new ExecutorCallAdapterFactory(callbackExecutor);
}
return DefaultCallAdapterFactory.INSTANCE;
}
对于Android平台来说,我们之前生成了一个对应的callbackExecutor,所以我们继续跟进if中的语句,发现最终生成了一个ExecutorCallAdapterFactory()对象,当然,我们主要是看它的get()方法能得到什么样的CallAdapter对象:
@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 new ExecutorCallbackCall<>(callbackExecutor, call);
}
};
}
这个get()方法生成了一个匿名的CallAdapter对象,所以:
serviceMethod.adapt(okHttpCall)最终就是调用这个匿名对象的adapt方法
可以看到adapt方法最终就是将OkHttpCall对象转换成了ExecutorCallbackCall对象。那这个对象能干什么?
static final class ExecutorCallbackCall implements Call {
final Executor callbackExecutor;
final Call delegate;
ExecutorCallbackCall(Executor callbackExecutor, Call delegate) {
this.callbackExecutor = callbackExecutor;
this.delegate = delegate;
}
@Override public void enqueue(final Callback callback) {
checkNotNull(callback, "callback == null");
delegate.enqueue(new Callback() {
@Override public void onResponse(Call call, final Response response) {
callbackExecutor.execute(new Runnable() {
@Override public void run() {
if (delegate.isCanceled()) {
// Emulate OkHttp's behavior of throwing/delivering an IOException on cancellation.
callback.onFailure(ExecutorCallbackCall.this, new IOException("Canceled"));
} else {
callback.onResponse(ExecutorCallbackCall.this, response);
}
}
});
}
@Override public void onFailure(Call call, final Throwable t) {
callbackExecutor.execute(new Runnable() {
@Override public void run() {
callback.onFailure(ExecutorCallbackCall.this, t);
}
});
}
});
}
@Override public boolean isExecuted() {
return delegate.isExecuted();
}
@Override public Response execute() throws IOException {
return delegate.execute();
}
@Override public void cancel() {
delegate.cancel();
}
@Override public boolean isCanceled() {
return delegate.isCanceled();
}
@SuppressWarnings("CloneDoesntCallSuperClone") // Performing deep clone.
@Override public Call clone() {
return new ExecutorCallbackCall<>(callbackExecutor, delegate.clone());
}
@Override public Request request() {
return delegate.request();
}
}
可以明显看到这个方法就是对OkHttpCall对象的一个包装,不同的是对它的enque()方法重写了,重写的目的很简单,就是为了将异步结果交给MainThreadExecutor,最终转换到主线程执行回调。
总结
上面源码分析了很多,有点杂乱,这里我们统一总结下OkHttpCall到接口定义的返回类型(这里以Call为例,)的转换过程:
通过platform(在Android平台上是它的子类Android) 生成一个Executor对象,在Android上就是MainThreadExecutor对象。
通过platform生成一个CallAdapterFactory对象,在Android上就是ExecutorCallAdapterFactory对象,该对象能通过get()方法生成一个CallAdapter对象,来将OkHttpCall对象转成ExecutorCallbackCall对象。
将上面提到的CallAdapterFactory对象塞到Retrofit对象中,最终在ServiceMethod的adapt()方法中调用,将OkHttpCall转成ExecutorCallback,然后就可以正常的调用enque()方法发起请求了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
你可能感兴趣的:(Retrofit源码之请求对象的转换笔记)
Prettier 插件 使用
取啥好
vscode 前端
要在VisualStudioCode中配置Prettier插件,使得在按下Ctrl+S时自动格式化代码,你可以按照以下步骤进行设置:安装Prettier插件:确保你已经在VisualStudioCode中安装了Prettier插件。你可以在左侧的侧边栏中点击"Extensions"图标,然后在搜索栏中输入"Prettier-Codeformatter",点击安装按钮进行安装。配置保存时格式化:打开
pyinstaller如何下载以及问题解决
如鸿毛
python
pyinstaller如何下载以及问题解决。①windows+R,输入cmd在控制面版输入pipinstallpyinstaller就可以下载。②成功会出现Successfullyinstalledpyinstaller-x.x.x.,同时在你的python的安装目录scripts。③在控制面板进入你编写程序的文件目录。④成功后,进入,生成的dist文件夹,按图片步骤输入回车,就可运行.exe文件
组装最大可靠性设备
无限码力
华为OD算法刷题笔记 算法 笔试 机试 华为odE卷 求职招聘
组装最大可靠性设备真题目录:点击去查看E卷200分题型题目描述一个设备由N种类型元器件组成(每种类型元器件只需要一个,类型type编号从0~N-1),每个元器件均有可靠性属性reliability,可靠性越高的器件其价格price越贵。而设备的可靠性由组成设备的所有器件中可靠性最低的器件决定。给定预算S,购买N种元器件(每种类型元器件都需要购买一个),在不超过预算的情况下,请给出能够组成的设备的最
【C语言】判断闰年 由if()语句判断实现 | C语言面试:C语言中的浮点数如何存储和计算?| 浮点数的存储格式,浮点数的编码规则,浮点数的计算规则
追光者♂
C语言 C++ Java百宝书(实例+解析) c语言 闰年 ifelse 判断闰年 C语言面试 浮点数的存储和计算 浮点数
“往往在逃避命运的路上,却与之不期而遇。”作者主页:追光者♂个人简介:[1]计算机专业硕士研究生[2]2023年城市之星领跑者TOP1(哈尔滨)[3]2022年度博客之星人工智能领域TOP4[4]阿里云社区特邀专家博主[5]CSDN-人工智能领域优质创作者
模块划分的艺术:控制范围与作用范围的平衡
码农技术栈
python java javascript 后端 架构
在软件设计中,模块化是构建复杂系统的基石。良好的模块划分能够提升代码的可读性、可维护性和可复用性。而“模块的作用范围应该在其控制范围之内”这一原则,则是模块划分的精髓所在。一、什么是控制范围和作用范围?控制范围指的是一个模块能够直接影响或控制的其他模块的集合。例如,一个负责用户登录的模块,其控制范围可能包括用户信息验证、权限管理等模块。作用范围指的是一个模块的功能所影响到的数据或系统的范围。例如,
PyInstaller下载、安装、使用
sayhhhui
pyinstaller 笔记 exe python
方法一:1、PyInstaller下载及安装win+Rcmd输入:pipinstallpyinstaller-ihttps://pypi.tuna.tsinghua.edu.cn/simple/即安装成功cmd命令行:pipinstallpyinstaller找到安装的位置在d盘2、PyInstaller的使用找到P
JS考核题
非星
javascript
JS考核题第一题-写出下列输出1.typeof(typeofA);2.typeof({})3.typeof(null)4.(false=='')5.(NaN==NaN)6.(null==undefined)7.(null===undefined)8.(0=='')9.("20"+20)10.(10+10+"20")答案1.string//typeof函数的返回值为字符串类型2.object3.ob
JavaScript窗口大小变化事件:window.resize
星际编程喵
探索Spring的奇妙世界 javascript 前端 html vue.js react.js 前端框架 html5
1.前言在Web开发中,JavaScript是一种强大的脚本语言,它可以与HTML和CSS一起使用,为用户提供交互性和动态性的体验。其中,window.addEventListener("resize")事件是一个常用的事件之一,用于在浏览器窗口大小发生变化时触发相应的操作。本文将深入介绍这个事件的相关内容。2.简介window.resize事件是浏览器提供的一种事件,用于监听窗口大小的改变。这意
numpy.float8不存在;Python中,实现16位浮点数
ZhangJiQun&MXP
教学 2021 论文 2024大模型以及算力 算法 python 数据结构 人工智能
目录python中矩阵的浮点数存储numpy.float8不存在Python中,实现16位浮点数实现float16关于float8python中矩阵的浮点数存储在Python中,矩阵通常是通过嵌套列表(listoflists)、NumPy数组(numpy.ndarray)或其他类似的数据结构来表示的。矩阵中存储的数值所占用的位数取决于多个因素,包括数值的类型(整数、浮点数等)以及具体的数值范围。嵌
新版Python所有方向的学习路线图,自学少走弯路秘籍
m0_67401920
面试 学习路线 阿里巴巴 android 前端 后端
最近花了不少时间专门去更新了一下Python所有方向的学习路线图,在之前的基础上做很多的改良,希望能够帮助自学的小伙伴们,多一份参考,避免少走弯路。但首先我得先说明一下,每个技术人对技术的看法都不尽相同,这只是我个人认为自学Python某些方向该掌握的一些知识点,希望大家能求同存异。学习路线图有什么作用?在放学习路线之前,我先来讲一下这个学习路线图有什么作用,避免有些新手看得云里雾里的。学习路线图
React Hooks forwardRef useImperativeHandle TypeScript类型 最佳实践
m0_67265464
面试 学习路线 阿里巴巴 java java进阶 后端
定义官网文档forwardRef:转发refuseImperativeHandle:用于自定义暴露给父组件的实例值版本"react":"^17.0.2""@types/react":"^17.0.44"代码父组件import{FC,useEffect,useRef}from'react';//导入子组件importChildComponent,{IRefProps}from'./ChildComp
23年用友提前批笔试真题-大数减法
四季夏目天下第一
java 算法 开发语言
大数减法题目描述以字符串的形式读入两个数字,编写一个函数计算它们的差,以字符串形式返回。输入描述输入两个数字(都为正数)输出描述两个输入数字的差输入示例12输出示例-1提示信息输入的数据可能会超出一般长整数的范围。思路:单纯的模拟减法就行,先判断两个数的大小确定最终计算结果的符号,不要忘记去掉最终结果里面的前导0。笔试为了追求速度也可以直接使用java中的BigDecimal类importjava
MariaDB数据库部署
m0_修道成仙
Linux linux 数据库
MariaDB数据库·数据库介绍·MySQL与MariaDB·数据库部署1.安装MariaDB数据库2.重启mariadb服务并加入开机启动项3.!数据库初始化4.设置防火墙策略5.登录数据库·数据库常用语句·创建数据库·查询指定位置数据·数据库备份·彻底删除数据库·恢复数据·数据库介绍数据库:是指按照某些特定结构来存储数据资料的数据仓库数据库管理系统:是一种能够对数据库中存放的数据进行建立、修改
解决Java使用SSE乱码问题
四季夏目天下第一
java 开发语言
我在使用Java中的SSE时出现下面这种情况:这是因为SSE返回给前端的默认编码格式为ISO_8859_1为了避免此类问题的出现,可以修改SSE的默认编码格式为UTF-8@Slf4jpublicclassSseEmitterUTF8extendsSseEmitter{ @Override protectedvoidextendResponse(ServerHttpResponseoutputM
代码随想录 Day 32 |【第八章 贪心算法 part 01】理论基础、455.分发饼干、376. 摆动序列、53. 最大子序和
Accept17
贪心算法 算法
一、理论基础代码随想录1.什么是贪心贪心的本质是选择每一阶段的局部最优,从而达到全局最优。2.贪心的解题步骤将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解二、455.分发饼干代码随想录1.解题思路尽量用最大的饼干去满足胃口大的孩子。2.代码实现(1)因为是用大饼干满足胃口大的孩子,所以对饼干、孩子胃口数组排序。定义一个result变量,用于记录喂饱了
【Vite】前端构建工具详解
Peter-Lu
# Vite 前端 javascript npm node.js webpack
文章目录一、构建工具概述1.什么是构建工具?2.常见的构建工具二、Vite的优势1.极速的开发服务器2.极速的冷启动3.高效的HMR(热模块替换)4.生产环境中的优化三、Vite的基本用法1.安装Vite2.项目结构3.启动开发服务器4.构建生产版本四、Vite的核心概念1.按需加载2.ESBuild3.Rollup打包五、Vite的扩展与定制1.插件系统2.环境变量六、Vite的应用场景1.适合
【走过路过,点开看看】用Python制作的五彩气球,很五彩呢
努力努力再努力呐
python python 开发语言
这是一个基于PythonTurtle模块的气球动画程序,用于儿童节祝福。通过气球类、漂浮函数和主函数的设计,实现气球动态漂浮和祝福语展示,展现Python的可编程性和动态性。使用python画气球前,先了解一下turtle。Turtle画板turtle.setup(width,height)#设置画板的大小Turtle画笔turtle.penup()#抬起画笔turtle.pendown()#放下
详谈React中 forwardRef、useImperativeHandle的使用场景
凉菜凉凉
React#+技术分享 react.js javascript 前端
forwardRef(render)允许组件使用ref将DOM节点暴露给父组件constSomeComponent=forwardRef(render)参数render:组件的渲染函数。React会调用该函数并传入父组件传递的props和ref。返回的JSX将作为组件的输出。返回值forwardRef返回一个可以在JSX中渲染的React组件。与作为纯函数定义的React组件不同,forwardR
DeepSeek本地部署的一些问题记录
沐沐uuu
DeepSeek
1、模型怎么不保存到C盘:关掉ollama之后,设置环境变量:OLLAMA_MODELS,环境变量的地址,改为你想要的地址,参考文章:https://blog.csdn.net/u012151594/article/details/1420621992、ollamarm模型名,删除新建的模型,缓存文件C:\Users\Administrator.ollama,找你对应的目录,删除即可3、1.5b模
MybatisPlus + SpringBoot + Vue 实现自定义联表查询,返回 HashMap<String, Object> 条件,分页,模糊,total
沐沐uuu
spring boot 后端 java
MybatisPlus+SpringBoot+Vue实现自定义联表查询,返回HashMap条件,分页,模糊,totalMybatisPlus极大的简化了单表查询的重复操作,但是在联表的时候,特别是在查询的结果集没有对应实体类的时候,就还要手写sql,手写分页和模糊,返回HashMap对象。这里我写一个Demo,以方便以后的开发中遇到这种情况。mapper.xmlSELECTa.APPLICATIO
but was actually of type ‘com.sun.proxy.$Proxy**‘ AOP事务代理混用
沐沐uuu
java spring aop
Causedby:org.springframework.beans.factory.BeanNotOfRequiredTypeException:Beannamed‘’isexpectedtobeoftype'’butwasactuallyoftype‘com.sun.proxy.$Proxy**’springaop代理混用解决出现问题的原因在java中默认使用的动态代理是JDKproxy基于接
解决远程桌面连接后没有声音的问题
huanghong6956
1.首先确定被远程主机已安装声卡和驱动,换句话说就是被远程主机可以出声2.在被远程主机上,开始-运行-gpedit.msc,打开组策略计算机配置-管理模板-终端服务-客户端/服务器数据重定向-启用“允许音频重定向3.重启4.欧了
springboot动态多数据源配置多线程切换问题
starsAreCloser
spring拓展 spring boot 后端 java
springboot动态多数据源配置多线程切换问题背景项目中使用了spring的AbstractRoutingDataSource来实现多数据切换动态功能,大体实现思路和链接中文章所述差不多的:link,一开始运行正常,后来对一个查询比较慢的接口做了优化,使用了多个线程并发处理,然后就出问题了,现象是请求每隔几次就报错表或视图不存在,也就是切换数据源失败了。排查思路先总结下我之前遇到过的各种切换失
SpringWebFlux结合多线程编写流式处理异步返回接口
starsAreCloser
springWebFlux 多线程编排 spring mvc spring boot
文章目录概要整体架构流程技术细节小结概要java使用多线程为关系型数据库结合spring响应式编程模拟流式处理整体架构流程使用webFlux的时候如果涉及到数据库操作是需要数据库支持的,非关系型数据库对此支持比较友好如redis的ReactiveStringRedisTemplate和MongoDB的ReactiveMongoRepository就支持该功能,但是关系型数据库oracle,mysq
5G NR 基本概念——BWP
冯白丁
5G NR 2/3/4/5g 网络通信
BWP:BandWidthPart部分带宽定义:给定μ值(确定子载波间隔)的一段连续的CRB作用优势:降低能耗,业务量小时,UE切换至带宽较小的BWP上提高系统灵活性,每个BWP可以采用不同的配置,根据业务切换合适的BWP前兼容,新技术可在新的BWP中提供,保证系统向前兼容分类:初始BWP:用于空闲态UE接收系统信息并完成随机接入。子载波间隔与频域位置及带宽MIB携带专用BWP:用于连接态UE数据
深入理解 C++ 算法之 SPFA
小白布莱克
c++ 算法 开发语言
在图论算法的世界里,单源最短路径问题是一个经典且重要的研究方向。SPFA(ShortestPathFasterAlgorithm)算法作为求解单源最短路径问题的一种高效算法,在C++编程中有着广泛的应用。本文将深入探讨SPFA算法的原理、实现步骤以及在C++中的代码实现。SPFA算法原理SPFA算法本质上是对Bellman-Ford算法的一种优化。Bellman-Ford算法通过对所有边进行多次松
万象公文全面接入DeepSeek,内容创作一键起飞!
Thuni_soft
人工智能 AIGC deepseek
近日,国产开源大模型DeepSeek-R1以其高性能、低成本的优势,犹如一匹黑马,成为全球增长速度最快的AI应用之一,引发热烈关注。目前,万象公文已与DeepSeek实现多场景深度对接,借助其强大的功能,进一步释放万象公文在公文智能写作领域中的潜力,轻松应对各种公文撰写需求。效率与质量双飞跃万象公文+DeepSeek的组合,使得公文创作的效率与质量都得到了显著的提高,同时私有化部署资源需求更低。我
夯实生态合作基础 | 华宇TAS应用中间件与安擎EG920A-G20、EG921A-G20完成兼容互认证
Thuni_soft
中间件
近日,华宇TAS应用中间件完成了与安擎计算机信息股份有限公司的EG920A-G20、EG921A-G20的兼容适配,双方产品协同运行稳定、性能表现卓越、使用体验良好,可满足用户安全性、可靠性及关键性应用需求。这也标志着华宇进一步扩大了在整机侧的生态及合作厂商。安擎计算机信息股份有限公司安擎计算机信息股份有限公司是专业的AI服务器及定制化方案提供商,具备服务器全生命周期研产销能力,始终致力于服务器自
信创生态版图持续拓宽 | 华宇TAS应用中间件与宝德自强PR210K系列服务器完成兼容互认证
Thuni_soft
中间件 服务器 运维
近日,华宇TAS应用中间件软件完成与宝德计算机系统股份有限公司自强PR210K系列服务器、自强PT620Q、PT620W台式机的兼容适配,双方将深入融合各自的产品优势和服务能力,为企事业单位的数字化转型提供高性价比、安全可靠的解决方案,充分满足客户对国产化应用的高标准要宝德计算机系统股份有限公司宝德计算机系统股份有限公司是中国领先的计算产品方案提供商,以服务器和PC整机的研发、生产、销售及提供相关
科技日报:华宇TAS应用中间件亮相2024政法智能化建设技术装备及成果展
Thuni_soft
中间件
近日,2024政法智能化建设技术装备及成果展在北京国家会议中心举行。成果展上,信创领域的华宇TAS应用中间件产品引人注目。中间件是一种基础软件,在信息系统中处于应用运行支撑及连接的基础地位,是构建数字化转型基础设施的中坚力量。TAS应用中间件由北京华宇信息技术有限公司于2011年发布,是一款面向党政机关和政法单位的中间件。北京华宇信息技术有限公司CTO孙明东介绍,在过去的十年里,华宇TAS应用中间
java线程Thread和Runnable区别和联系
zx_code
java jvm thread 多线程 Runnable
我们都晓得java实现线程2种方式,一个是继承Thread,另一个是实现Runnable。
模拟窗口买票,第一例子继承thread,代码如下
package thread;
public class ThreadTest {
public static void main(String[] args) {
Thread1 t1 = new Thread1(
【转】JSON与XML的区别比较
丁_新
json xml
1.定义介绍
(1).XML定义
扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML使用DTD(document type definition)文档类型定义来组织数据;格式统一,跨平台和语言,早已成为业界公认的标准。
XML是标
c++ 实现五种基础的排序算法
CrazyMizzz
C++ c 算法
#include<iostream>
using namespace std;
//辅助函数,交换两数之值
template<class T>
void mySwap(T &x, T &y){
T temp = x;
x = y;
y = temp;
}
const int size = 10;
//一、用直接插入排
我的软件
麦田的设计者
我的软件 音乐类 娱乐 放松
这是我写的一款app软件,耗时三个月,是一个根据央视节目开门大吉改变的,提供音调,猜歌曲名。1、手机拥有者在android手机市场下载本APP,同意权限,安装到手机上。2、游客初次进入时会有引导页面提醒用户注册。(同时软件自动播放背景音乐)。3、用户登录到主页后,会有五个模块。a、点击不胫而走,用户得到开门大吉首页部分新闻,点击进入有新闻详情。b、
linux awk命令详解
被触发
linux awk
awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息
awk处理过程: 依次对每一行进行处理,然后输出
awk命令形式:
awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
[-F|-f|-v]大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=val
各种语言比较
_wy_
编程语言
Java Ruby PHP 擅长领域
oracle 中数据类型为clob的编辑
知了ing
oracle clob
public void updateKpiStatus(String kpiStatus,String taskId){
Connection dbc=null;
Statement stmt=null;
PreparedStatement ps=null;
try {
dbc = new DBConn().getNewConnection();
//stmt = db
分布式服务框架 Zookeeper -- 管理分布式环境中的数据
矮蛋蛋
zookeeper
原文地址:
http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/
安装和配置详解
本文介绍的 Zookeeper 是以 3.2.2 这个稳定版本为基础,最新的版本可以通过官网 http://hadoop.apache.org/zookeeper/来获取,Zookeeper 的安装非常简单,下面将从单机模式和集群模式两
tomcat数据源
alafqq
tomcat
数据库
JNDI(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。
没有使用JNDI时我用要这样连接数据库:
03. Class.forName("com.mysql.jdbc.Driver");
04. conn
遍历的方法
百合不是茶
遍历
遍历
在java的泛
linux查看硬件信息的命令
bijian1013
linux
linux查看硬件信息的命令
一.查看CPU:
cat /proc/cpuinfo
二.查看内存:
free
三.查看硬盘:
df
linux下查看硬件信息
1、lspci 列出所有PCI 设备;
lspci - list all PCI devices:列出机器中的PCI设备(声卡、显卡、Modem、网卡、USB、主板集成设备也能
java常见的ClassNotFoundException
bijian1013
java
1.java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory 添加包common-logging.jar2.java.lang.ClassNotFoundException: javax.transaction.Synchronization
【Gson五】日期对象的序列化和反序列化
bit1129
反序列化
对日期类型的数据进行序列化和反序列化时,需要考虑如下问题:
1. 序列化时,Date对象序列化的字符串日期格式如何
2. 反序列化时,把日期字符串序列化为Date对象,也需要考虑日期格式问题
3. Date A -> str -> Date B,A和B对象是否equals
默认序列化和反序列化
import com
【Spark八十六】Spark Streaming之DStream vs. InputDStream
bit1129
Stream
1. DStream的类说明文档:
/**
* A Discretized Stream (DStream), the basic abstraction in Spark Streaming, is a continuous
* sequence of RDDs (of the same type) representing a continuous st
通过nginx获取header信息
ronin47
nginx header
1. 提取整个的Cookies内容到一个变量,然后可以在需要时引用,比如记录到日志里面,
if ( $http_cookie ~* "(.*)$") {
set $all_cookie $1;
}
变量$all_cookie就获得了cookie的值,可以用于运算了
java-65.输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,则输出1、2、3一直到最大的3位数即999
bylijinnan
java
参考了网上的http://blog.csdn.net/peasking_dd/article/details/6342984
写了个java版的:
public class Print_1_To_NDigit {
/**
* Q65.输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,则输出1、2、3一直到最大的3位数即999
* 1.使用字符串
Netty源码学习-ReplayingDecoder
bylijinnan
java netty
ReplayingDecoder是FrameDecoder的子类,不熟悉FrameDecoder的,可以先看看
http://bylijinnan.iteye.com/blog/1982618
API说,ReplayingDecoder简化了操作,比如:
FrameDecoder在decode时,需要判断数据是否接收完全:
public class IntegerH
js特殊字符过滤
cngolon
js特殊字符 js特殊字符过滤
1.js中用正则表达式 过滤特殊字符, 校验所有输入域是否含有特殊符号function stripscript(s) { var pattern = new RegExp("[`~!@#$^&*()=|{}':;',\\[\\].<>/?~!@#¥……&*()——|{}【】‘;:”“'。,、?]"
hibernate使用sql查询
ctrain
Hibernate
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.hibernate.Hibernate;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transa
linux shell脚本中切换用户执行命令方法
daizj
linux shell 命令 切换用户
经常在写shell脚本时,会碰到要以另外一个用户来执行相关命令,其方法简单记下:
1、执行单个命令:su - user -c "command"
如:下面命令是以test用户在/data目录下创建test123目录
[root@slave19 /data]# su - test -c "mkdir /data/test123"
好的代码里只要一个 return 语句
dcj3sjt126com
return
别再这样写了:public boolean foo() { if (true) { return true; } else { return false;
Android动画效果学习
dcj3sjt126com
android
1、透明动画效果
方法一:代码实现
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
View rootView = inflater.inflate(R.layout.fragment_main, container, fals
linux复习笔记之bash shell (4)管道命令
eksliang
linux管道命令汇总 linux管道命令 linux常用管道命令
转载请出自出处:
http://eksliang.iteye.com/blog/2105461
bash命令执行的完毕以后,通常这个命令都会有返回结果,怎么对这个返回的结果做一些操作呢?那就得用管道命令‘|’。
上面那段话,简单说了下管道命令的作用,那什么事管道命令呢?
答:非常的经典的一句话,记住了,何为管
Android系统中自定义按键的短按、双击、长按事件
gqdy365
android
在项目中碰到这样的问题:
由于系统中的按键在底层做了重新定义或者新增了按键,此时需要在APP层对按键事件(keyevent)做分解处理,模拟Android系统做法,把keyevent分解成:
1、单击事件:就是普通key的单击;
2、双击事件:500ms内同一按键单击两次;
3、长按事件:同一按键长按超过1000ms(系统中长按事件为500ms);
4、组合按键:两个以上按键同时按住;
asp.net获取站点根目录下子目录的名称
hvt
.net C# asp.net hovertree Web Forms
使用Visual Studio建立一个.aspx文件(Web Forms),例如hovertree.aspx,在页面上加入一个ListBox代码如下:
<asp:ListBox runat="server" ID="lbKeleyiFolder" />
那么在页面上显示根目录子文件夹的代码如下:
string[] m_sub
Eclipse程序员要掌握的常用快捷键
justjavac
java eclipse 快捷键 ide
判断一个人的编程水平,就看他用键盘多,还是鼠标多。用键盘一是为了输入代码(当然了,也包括注释),再有就是熟练使用快捷键。 曾有人在豆瓣评
《卓有成效的程序员》:“人有多大懒,才有多大闲”。之前我整理了一个
程序员图书列表,目的也就是通过读书,让程序员变懒。 写道 程序员作为特殊的群体,有的人可以这么懒,懒到事情都交给机器去做,而有的人又可
c++编程随记
lx.asymmetric
C++ 笔记
为了字体更好看,改变了格式……
&&运算符:
#include<iostream>
using namespace std;
int main(){
int a=-1,b=4,k;
k=(++a<0)&&!(b--
linux标准IO缓冲机制研究
音频数据
linux
一、什么是缓存I/O(Buffered I/O)缓存I/O又被称作标准I/O,大多数文件系统默认I/O操作都是缓存I/O。在Linux的缓存I/O机制中,操作系统会将I/O的数据缓存在文件系统的页缓存(page cache)中,也就是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。1.缓存I/O有以下优点:A.缓存I/O使用了操作系统内核缓冲区,
随想 生活
暗黑小菠萝
生活
其实账户之前就申请了,但是决定要自己更新一些东西看也是最近。从毕业到现在已经一年了。没有进步是假的,但是有多大的进步可能只有我自己知道。
毕业的时候班里12个女生,真正最后做到软件开发的只要两个包括我,PS:我不是说测试不好。当时因为考研完全放弃找工作,考研失败,我想这只是我的借口。那个时候才想到为什么大学的时候不能好好的学习技术,增强自己的实战能力,以至于后来找工作比较费劲。我
我认为POJO是一个错误的概念
windshome
java POJO 编程 J2EE 设计
这篇内容其实没有经过太多的深思熟虑,只是个人一时的感觉。从个人风格上来讲,我倾向简单质朴的设计开发理念;从方法论上,我更加倾向自顶向下的设计;从做事情的目标上来看,我追求质量优先,更愿意使用较为保守和稳妥的理念和方法。
&