前言 基于以下参考进行改良封装
一、接入前准备,将下面的依赖导入工程里面
implementation 'io.reactivex.rxjava2:rxjava:2.1.0'
// 必要rxjava2依赖
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
// 必要rxandrroid依赖,切线程时需要用到
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
// 必要retrofit依赖
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
// 必要依赖,和Rxjava结合必须用到,
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
// 必要依赖,解析json字符所用
//非必要依赖, log依赖,如果需要打印OkHttpLog需要添加
implementation 'com.squareup.okhttp3:logging-interceptor:3.8.1'
// gson转换工厂
implementation 'com.google.code.gson:gson:2.8.5'
二、Retrofit使用讲解(网上许多参考故略)
三、工程结构图
四、封装流程
1. 进行Retrofit的封装
单例化Retrofit管理类
初始化okhttp
初始化retrofit
private static final String CACHE_PATH = "httpCache";
public static final long CACHE_SIZE = 1024 * 1024 * 100;
public static final int TIMEOUT = 15; //超时时间
private static volatile RetrofitManager mInstance;
private Retrofit mRetrofit; //retorfit对象
private OkHttpClient mOkhttpClient; //okhttp对象
private ServerApi api; //生成接口类
//单利化
public static ServerApi getServerApi() {
if (mInstance == null) {
synchronized (RetrofitManager.class) {
if (mInstance == null) {
mInstance = new RetrofitManager();
}
}
}
return mInstance.api;
}
/**
* 构造器中初始化okhttp和retrofit
*/
private RetrofitManager() {
initOkhttp();//初始化okhttp
initRetrofit(); //初始retrofit
}
/**
* 初始化retrofit
*/
private void initRetrofit() {
mRetrofit = new Retrofit.Builder()
.baseUrl(CommonConstant.BASE_URL)
.addConverterFactory(CustomGsonFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(mOkhttpClient)
.build();
api = mRetrofit.create(ServerApi.class);
}
/**
* 初始化okhttp
*
* @return
*/
private void initOkhttp() {
//头部参数拦截器
HeaderParamsInterceptor commonParamsInterceptor = new HeaderParamsInterceptor();
//日志参数拦截器
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
//关联相应的拦截器
interceptor.setLevel(CommonConstant.IS_DEBUG ? HttpLoggingInterceptor.Level.BODY : HttpLoggingInterceptor.Level.NONE);
if (mOkhttpClient == null) {
synchronized ((RetrofitManager.class)) {
if (mOkhttpClient == null) {
//增加缓存
Cache cache = new Cache(new File(MyApplication.getInstance().getCacheDir(), CACHE_PATH), CACHE_SIZE);
mOkhttpClient = new OkHttpClient.Builder()
.cache(cache)
.addInterceptor(interceptor)
.addInterceptor(commonParamsInterceptor)
// .retryOnConnectionFailure(true)
.connectTimeout(TIMEOUT, TimeUnit.SECONDS)
.build();
}
}
}
}
/**
* 用于创建相关类
*
* @param clazz
* @param
* @return
*/
public T create(Class clazz) {
if (mRetrofit != null) {
return mRetrofit.create(clazz);
}
return null;
}
2.根据要求封装请求基类,响应基类,以及错误基类
请求基类,由于我们请求会将请求参数放在请求体中,然后通过json数据传给服务器
public class BaseRequest {
private T options;
public T getOptions() {
return options;
}
public void setOptions(T options) {
this.options = options;
}
}
响应基类,一般情况会有msg ,code,data这三个字段
public class BaseResponse {
@SerializedName(value = "code", alternate = "status")
private int code; //返回码
private T data; //具体数据结果
private String msg; //返回信息
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
错误基类,可以根据实际情况来,我们接口的请求放在errorbody中,故可以这样处理,但是如果放在response中通过这就需要灵活处理这个数据,防止类造型错误。
public class FailureBody {
private List data;
@SerializedName(value = "code",alternate = "status")
private int code;
private String msg;
public List getData() {
return data;
}
public void setData(List data) {
this.data = data;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
3.Observable的生成
通过ObjectNetLoader这个类,简化相应的线程切换
通过继承的NetDataLoader这个类生成相应的Observable对象
public class ObjectLoader {
/**
* 用于封装相关
* @param observable
* @param
* @return
*/
protected Observable observer(Observable observable){
return observable.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
}
/**
* 用于对数据提前处理,同时也可用来对参数处理
* 例如合并,map ,zip或者flateMap这样可以将不符合自己参数的数据转换为自己想请求的参数
* 这一层是属于module内,用于处理数据源,供给presenter作为中间纽带进行调用
*/
public class NetDataLoader extends ObjectLoader {
private ServerApi api;
private NetDataLoader() {
api = RetrofitManager.getServerApi();
}
public static NetDataLoader loader;
public static NetDataLoader get() {
if (loader == null) {
synchronized (NetDataLoader.class) {
if (loader == null) {
loader = new NetDataLoader();
}
}
}
return loader;
}
/*******************************请求数据*****************************************/
/************************************用户**************************************/
//用用户信息登录
public Observable> postUserLogin(ReqUserLogin bean) {
return observer(api.postUserLogin(getRequestBody(bean))); //请求参数的初步处理
}
/***********************请求数据modle类*************************************/
//用于对请求数据model修改为json数据
private BaseRequest getRequestBody(T data) {
if (data == null)
return null;
BaseRequest requestBody = new BaseRequest<>();
requestBody.setOptions(data);
return requestBody;
}
}
observer的生成,自定义Myobserver,既可以作为回调(供MVP中module回调接口),也可以作为单独使用。
/**
* @param
*/
public abstract class MyObserver implements io.reactivex.Observer> {
private Disposable d;
@Override
public void onSubscribe(Disposable d) {
SubscriptionManager.newStance().add(d);//提前添加相应的Disposable
this.d = d;
onDisposable(d);
}
@Override
public void onNext(BaseResponse response) {
if (response.getCode() == 200) {//通过200说明请求成功
onSuccess(response);
}
SubscriptionManager.newStance().cancel(d);
}
@Override
public void onError(Throwable e) {
onFail(ExceptionHandle.handleException(e));
SubscriptionManager.newStance().cancel(d);
}
@Override
public void onComplete() {
onCompleted();
SubscriptionManager.newStance().cancel(d);
}
public abstract void onSuccess(BaseResponse t);
public abstract void onFail(ExceptionHandle.ResponseThrowable throwable);
public abstract void onCompleted();
public abstract void onDisposable(Disposable d);
}
4.Rxjava相关管理,防止发生内存泄漏
用于管理Rxjava,及时的取消订阅,防止出现泄漏等情况(包括了Helper,以及管理类)
/**
* 订阅监听器帮助类
* @param
*/
public interface SubscriptionHelper {
void add(Disposable disposable); //添加
void cancel(Disposable t); //取消
void cancelAll(); //取消所有订阅
}
public class SubscriptionManager implements SubscriptionHelper {
public CompositeDisposable mDisposables;
private static SubscriptionManager manager;
private SubscriptionManager(){
if(mDisposables == null){
mDisposables = new CompositeDisposable();
}
}
public static SubscriptionManager newStance(){
if(manager == null){
synchronized (SubscriptionManager.class){
if(manager == null){
manager = new SubscriptionManager();
}
}
}
return manager;
}
@Override
public void add(Disposable disposable) {
if(disposable == null) return;
mDisposables.add(disposable);
}
@Override
public void cancel(Disposable t) {
if(null == t) return;
mDisposables.delete(t);
}
@Override
public void cancelAll() {
if(mDisposables != null && mDisposables.size() > 0){
if(!mDisposables.isDisposed())
mDisposables.dispose();
mDisposables.clear();
}
}
}
5.异常处理类
用于对错误和异常的同意处理,通过在自定义observer中onError的回调中throwable的进行相关处理,从而统一回调给onFailure方法中,
public class ExceptionHandle {
private static final int UNAUTHORIZED = 401; //用户信息无效
private static final int FORBIDDEN = 403;
private static final int NOT_FOUND = 404;
private static final int REQUEST_TIMEOUT = 408;
private static final int INTERNAL_SERVER_ERROR = 500;
private static final int BAD_GATEWAY = 502;
private static final int SERVICE_UNAVAILABLE = 503;
private static final int GATEWAY_TIMEOUT = 504;
private static final int FAIL_QUEST = 406;//无法使用请求的内容特性来响应请求的网页
private static final int BAD_REQUEST = 400;
private static ResponseBody body;
public static ResponseThrowable handleException(Throwable e) {
ResponseThrowable ex;
if (e instanceof HttpException) {
HttpException httpException = (HttpException) e;
ex = new ResponseThrowable(e, ERROR.HTTP_ERROR);
switch (httpException.code()) {
case UNAUTHORIZED:
body = ((HttpException) e).response().errorBody();
try {
String message = body.string();
FailureBody body = GsonUtil.GsonToBean(message, FailureBody.class);
ex.code = body.getCode();
ex.message = body.getMsg();
} catch (IOException e1) {
e1.printStackTrace();
}
break;
case FORBIDDEN:
ex.message = "服务器已经理解请求,但是拒绝执行它";
break;
case NOT_FOUND:
body = ((HttpException) e).response().errorBody();
try {
String message = body.string();
FailureBody body = GsonUtil.GsonToBean(message, FailureBody.class);
ex.code = body.getCode();
ex.message = body.getMsg();
} catch (IOException e1) {
e1.printStackTrace();
}
break;
case REQUEST_TIMEOUT:
ex.message = "请求超时";
break;
case GATEWAY_TIMEOUT:
case INTERNAL_SERVER_ERROR:
ex.message = "服务器遇到了一个未曾预料的状况,无法完成对请求的处理";
break;
case BAD_REQUEST:
body = ((HttpException) e).response().errorBody();
try {
String message = body.string();
FailureBody failureBody = GsonUtil.GsonToBean(message, FailureBody.class);
ex.message = failureBody.getMsg();
ex.code = failureBody.getCode();
} catch (IOException e1) {
e1.printStackTrace();
}
break;
case BAD_GATEWAY:
case SERVICE_UNAVAILABLE:
case FAIL_QUEST:
body = ((HttpException) e).response().errorBody();
try { //用于处理相关信息
String message = body.string();
Gson gson = new Gson();
// ErrorBodyDTO globalExceptionDTO = gson.fromJson(message, ErrorBodyDTO.class);
// if (globalExceptionDTO.getErrMsg() != null) {
// ex.message = globalExceptionDTO.getErrMsg();
// } else {
// ex.message = "";
// }
} catch (IOException e1) {
e1.printStackTrace();
}
break;
default:
ex.message = "网络错误";
break;
}
return ex;
} else if (e instanceof ServerException) {
ServerException resultException = (ServerException) e;
ex = new ResponseThrowable(resultException, resultException.code);
ex.message = resultException.message;
return ex;
} else if (e instanceof JsonParseException
|| e instanceof JSONException
|| e instanceof ParseException) {
ex = new ResponseThrowable(e, ERROR.PARSE_ERROR);
ex.message = "解析错误";
return ex;
} else if (e instanceof ConnectException) {
ex = new ResponseThrowable(e, ERROR.NETWORD_ERROR);
ex.message = "连接失败";
return ex;
} else if (e instanceof javax.net.ssl.SSLHandshakeException) {
ex = new ResponseThrowable(e, ERROR.SSL_ERROR);
ex.message = "证书验证失败";
return ex;
} else if (e instanceof java.net.SocketTimeoutException) {
ex = new ResponseThrowable(e, ERROR.TIMEOUT_ERROR);
//ex.message = "连接超时";
ex.message = "当前网络连接不顺畅,请稍后再试!";
return ex;
} else if (e instanceof java.net.UnknownHostException) {
ex = new ResponseThrowable(e, ERROR.TIMEOUT_ERROR);
ex.message = "网络中断,请检查网络状态!";
return ex;
} else if (e instanceof javax.net.ssl.SSLException) {
ex = new ResponseThrowable(e, ERROR.TIMEOUT_ERROR);
ex.message = "网络中断,请检查网络状态!";
return ex;
} else if (e instanceof java.io.EOFException) {
ex = new ResponseThrowable(e, ERROR.PARSE_EmptyERROR);
ex.message = "1007";
return ex;
} else if (e instanceof java.lang.NullPointerException) {
ex = new ResponseThrowable(e, ERROR.PARSE_EmptyERROR);
ex.message = "数据为空,显示失败";
return ex;
} else {
ex = new ResponseThrowable(e, ERROR.UNKNOWN);
ex.message = "未知错误";
return ex;
}
}
/**
* 约定异常
*/
public class ERROR {
/**
* 未知错误
*/
public static final int UNKNOWN = 1000;
/**
* 解析错误
*/
public static final int PARSE_ERROR = 1001;
/**
* 解析no content错误
*/
public static final int PARSE_EmptyERROR = 1007;
/**
* 网络错误
*/
public static final int NETWORD_ERROR = 1002;
/**
* 协议出错
*/
public static final int HTTP_ERROR = 1003;
/**
* 证书出错
*/
public static final int SSL_ERROR = 1005;
/**
* 连接超时
*/
public static final int TIMEOUT_ERROR = 1006;
public static final int LOGIN_ERROR = -1000;
public static final int DATA_EMPTY = -2000;
}
public static class ResponseThrowable extends Exception {
public int code;
public String message;
public ResponseThrowable(Throwable throwable, int code) {
super(throwable);
this.code = code;
}
public ResponseThrowable(String message, int code) {
this.code = code;
this.message = message;
}
}
public class ServerException extends RuntimeException {
public int code;
public String message;
public ServerException(int code, String message) {
this.code = code;
this.message = message;
}
}
}
5.使用方法
NetDataLoader.get().postUserLogin(request).subscribe(new MyObserver() {
@Override
public void onSuccess(BaseResponse t) {
}
@Override
public void onFail(ExceptionHandle.ResponseThrowable throwable) {
}
@Override
public void onCompleted() {
}
@Override
public void onDisposable(Disposable d) {
}
});
五、git传送门
六、参考
1.Rxjava2+Retrofit2+MVP的网络请求封装
2.Android版&Kotlin版RxJava2+Retrofit2+OkHttp3的基础、封装和项目中的使用
你可能感兴趣的:(Retrofit+rxjava的封装)
2025年:信创替代的关键之年
了不起的云计算V
人工智能 大数据
2025年,将成为信创替代进程中的关键一年。在国家政策的强力推动下,信创产业正加速实现国产化替代,从技术突破到市场拓展,从产业链完善到应用场景的全面铺开,信创产业即将迎来全面爆发的临界点。一、政策引领:信创替代的加速引擎自2020年信创产业进入规模化推广阶段以来,国家政策持续加码。2023年9月底下发的79号文更是为信创替代按下了“快进键”,明确要求到2027年央企国企100%完成信创替代,涵盖芯
C#上位机软件———串口
奥特曼12号
WPF c#
导入命名空间usingSystem.IO.Ports;//串口类SerialPort属于该命名空间string[]portStr=SerialPort.GetPortNames();//搜索当前设备下的串口//该方法为串口类的静态方法,调用方法类名+函数名类实例与参数初始化publicSerialPortsp=newSerialPort();DataBits:读写每个字节的标准数据位长度。数据位值
x265 接口函数 API 功能详细介绍
码流怪侠
视频编解码 HEVC x265 音视频 API
接口函数详细介绍x265_param_alloc:该函数会分配一个x265_param的实例,这个结构体用于存储x265编解码器的参数。返回的x265_param结构体本身没有特殊之处,但它允许应用程序通过x265_param_free(释放内存)和x265_param_parse(通过名称设置值)等函数来操作,从而实现版本安全。x265_param_free:释放通过x265_param_all
深度解析Linux中的编译器gcc/g++
xghfcgc
linux 运维 服务器
gcc只用来编译C语言g++用来编译C/C++程序的翻译步骤经历四个过程的1、预处理(进行宏替换/去注释/条件编译/头文件展开等)这个-E的意思是从现在开始,进行程序的翻译,一但预处理做完了,就停下来那么这里的code.i保存的是预处理之后的结果我们这里的-o选项就是指明了我们的生成文件的名称了那么我们将这个code.i文件和原始的code.c进行对比下对比发现我们的源文件有24行,预处理结算的代
编译原理第五章——自下而上分析——LR(1)超详细分析!
爱吃芝麻汤圆
# 编译原理 汇编
本文中内容整理西安交通大学软件学院吴晓军老师的ppt中,仅供学习使用,请勿转载或他用参考教材:《程序设计语言编译原理》(第3版)陈火旺等国防工业出版社编译原理第五章——自下而上分析目录一、复习:语法分析的两种方式二、自下而上分析概述1.核心思想:移进-规约2.规范规约3.规范规约的两个问题三、算符优先分析1.概念辨析-算符文法、算符优先文法2.概念辨析-算符优先分析法、直观算符优先分析法3.概念辨
c语言如何输入带\n和空格的字符串
爱吃芝麻汤圆
C语言 c语言 数据结构 c++
目录c语言如何输入带空格的字符串c语言如何输入空格加回车的字符串c语言如何输入带空格的字符串例题引入~~【题目内容】编写程序,输入可能带空格的字符串,计算并输入其长度(即字符个数,含空格数)。字符串最大长度不超过100。使用字符数组实现,不使用字符串库函数。输入:可能带空格的字符串。输出:一个非负整数,字符串的长度。样例输入:IlikeC++.样例输出:11思路:这道题要使用数组储存输入的内容,判
C#上位机开发之与西门子PLC通信
木林森先生
网络
在做上位机开发时,经常会遇到上位机与PLC通讯的情况。那么,上位机如何与PLC进行通讯呢?本篇内容以西门子PLCS7-200smart为例,实现上位机与PLC的通讯功能。一、前言200smartPLC有着丰富的通信端口,集成强大的以太网通信。S7-200SMARTCPU模块本体集成1个以太网接口和1个RS485接口,通过扩展CM01信号板,其通信端口数量最多可增至3个。可满足小型自动化设备连接触摸
C#上位机工作感想1(2020.7.1-2021.4.4)
有追求的菜鸟
C#WinForm c#
C#上位机工作感想(2020.7.1-2021.4.4)前言一、2020年二、2021年总结前言不知不觉工作已九个月有余了,从刚来公司还是个啥也不太懂得小菜鸟,现在已经是负责两个项目的大菜鸟啦。这大半年的时间内,师傅教给了我很多业务上的知识,自己也在工作和闲暇时间里学到了很多编程知识。对C#语言的底层实现和一些简单设计模式的应用都有了更深的理解。一、2020年先来说说项目路线吧,去年七月份刚来公司
前端面试题
木輮
javascript javascript 前端 vue.js
文章目录一、闭包(完)二、原型链(完)三、防抖和节流(完)四、Vue相关1、MVC和MVVM的区别2、v-model原理3、vue中的data为什么是一个函数?(面试常问)4、v-if和v-show的区别5、v-for中为什么要有key6、dist目录打包后过大,解决办法?7、watch和computed的区别8、子组件给父组件传递数据9、全局事件总线:可以实现任意组件间的数据传递10、Vue生命
Android音视频开发实战系列教程
Stark T
android 音视频
Android音视频开发实战系列教程指南在这篇文章中,我们将通过一个逐步流程,帮助刚入行的小白学习如何进行Android音视频开发。本教程会展示实施的步骤、所需的代码示例及其注释,最后还包括旅行图和类图来进一步帮助理解。开发流程我们可以将音视频开发的整个流程分为以下几个步骤。请看下表:步骤描述1.环境搭建安装所需的软件和开发工具2.项目创建创建Android项目并导入其他依赖库3.引入音视频SDK
PB 级别的大数据?
百态老人
大数据
在当今数字化时代,PB级别大数据正日益成为各领域关注的焦点。PB即佩他字节,1PB约等于1000TB或100万GB,代表着极为庞大的数据存储容量。中国科研团队在超大容量超分辨三维光存储研究中取得突破性进展。上海光学精密机械研究所与上海理工大学等科研单位合作,利用国际首创的双光束调控聚集诱导发光超分辨光存储技术,实现了点尺寸为54nm、道间距为70nm的超分辨数据存储,并完成了100层的多层记录,单
Android平台FFmpeg多媒体处理实战
雲明
本文还有配套的精品资源,点击获取简介:FFmpeg在Android平台为开发者提供强大的音视频处理能力,涵盖编解码、容器格式解析、软硬解码切换、音频重采样和视频转换等关键功能。本项目介绍如何集成FFmpeg到Android应用,包括编译库、解封装、解码、硬解支持、音频重采样、视频转换和测试代码的使用,为音视频应用开发提供完整流程的实践指南。1.Android平台上FFmpeg的应用和重要性1.1F
工作流程设计 php,php工程狮感知的前端工作流程
三符
工作流程设计 php
这个时代不懂点前端知识,真的没有办法生存。就算不会写,也得了解它的原理吧!最近做了一些总结,之前都是迷迷糊糊,搞不清楚前端之前的相关定位。好好梳理了一下。错误之处请各位指正。本文主要说的是JavaScript工作流程目前前端真的该叫大前端,其越来越细化,越来越复杂。在这种背景下,诞生了很多工具很多前端工作流程。比如热门的:reactvuewebpackbabelgulpnode.jsnpmnvma
前端经典的JavaScript面试知识总结
weixin_33982670
面试 前端 javascript ViewUI
1、使用typeofbar==="object"来确定bar是否是一个对象时有什么潜在的缺陷?这个陷阱如何避免?尽管typeofbar===“object”是检查bar是否是对象的可靠方法,但JavaScript中令人惊讶的问题null也被认为是一个对象!因此,对于大多数开发人员来说,下面的代码会将true(而不是false)打印到控制台:varbar=null;console.log(typeo
FFmpeg音视频编解码优化
AI天才研究院
计算 AI大模型企业级应用开发实战 DeepSeek R1 & 大数据AI人工智能大模型 java python javascript kotlin golang 架构 人工智能 大厂程序员 硅基计算 碳基计算 认知计算 生物计算 深度学习 神经网络 大数据 AIGC AGI LLM 系统架构设计 软件哲学 Agent 程序员实现财富自由
FFmpeg音视频编解码优化关键词FFmpeg音视频编解码优化策略性能测试实战案例摘要本文将围绕FFmpeg音视频编解码优化这一主题,详细介绍FFmpeg的基础知识、安装配置、音视频编解码原理、性能优化方法,以及实际应用中的实战案例。通过对FFmpeg的深入分析,读者将了解到如何高效地利用FFmpeg进行音视频处理,提升编解码性能,为音视频处理项目提供实用的优化方案。目录大纲第一部分:FFmpeg
解锁Archive of Our Own的无限可能
sgsdhd
sqlite oracle json sql database redis
项目介绍AO3API是一个非官方的Python库,旨在通过编程方式访问ArchiveofOurOwn(AO3)网站的数据。AO3是一个广受欢迎的同人作品存档网站,拥有大量的同人小说、评论和用户数据。通过AO3API,开发者可以轻松地获取、处理和分析这些数据,从而为同人社区带来更多创新的应用和服务。项目技术分析AO3API的核心功能被划分为九个模块:works、chapters、users、seri
03 手把手教你理解Vue Router核心原理(附实战代码)
泯泷
Vue2 快速入门 ui html5 css3 前端 前端框架 Vue vue.js
一、前端路由的魔法原理想象你在一本魔法书中翻页,页面内容会变化但书本本身不会重新印刷。前端路由就是这样的魔法,当我们在单页应用(SPA)中切换页面时:不会触发真正的页面刷新页面内容通过JavaScript动态更新URL会同步变化反映当前状态二、三种路由模式大比拼1.Hash模式(默认模式)工作原理:利用URL中的#符号(锚点)实现路由切换//创建路由实例import{createRouter,cr
2025年智慧化工园区整体解决方案-下载:安全生产管控,全生命周期数字管理架构
百家方案
解决方案 安全 架构 智慧化工园区
随着化工产业的快速发展,化工园区作为产业集聚的重要载体,面临着安全生产、环境保护、高效运营等诸多挑战。传统管理模式已难以满足现代化发展需求,智慧化工园区的建设成为必然趋势。本文将介绍智慧化工园区的整体解决方案,重点聚焦于安全生产管控和全生命周期数字管理架构。智慧化工园区标准规范及顶层设计指南、整体解决方案及售前PPT、大厂解决方案宣讲视频案例等全套资料。11名专业售前方案工程师,工作中精心总结准备
普通屏幕已过时?裸眼3D屏幕显示效果更胜一筹!
振邦视界
科技 3d
随着多媒体技术的迅猛进步,我们日常生活中的内容展现方式,已经经历了前所未有的变革。在这其中,裸眼3D屏幕的应用,无疑是最为引人注目的亮点,它相较于传统屏幕,在显示效果上展现出了鲜明的优势,不仅为观众带来了全新的视觉盛宴,更在沉浸感和交互性上实现了质的飞跃。那么,这两种屏幕技术之间究竟隐藏着怎样的差异呢?一、立体画面传统的屏幕显示内容主要停留在平面效果上,若想要实现3D的立体视觉,观众通常需佩戴3D
连锁收银系统的核心架构与技术选型
连锁收银系统
收银系统 连锁收银系统 架构 连锁收银系统
在连锁门店的日常运营里,连锁收银系统扮演着极为重要的角色,它不仅承担着交易结算的基础任务,还关联着库存管理、会员服务、数据分析等多个关键环节。一套设计精良的核心架构与合理的技术选型,是保障收银系统高效、稳定运行的基础。一、核心架构分层架构设计:通常采用经典的三层架构,即表现层、业务逻辑层和数据访问层。表现层负责与用户交互,比如收银员操作界面、顾客支付界面等,需要设计得简洁直观,操作便捷,以提高收银
音视频:11.Shell脚本-动手编译FFmpeg
eastRiseWm
音视频
Shell脚本-动手编译FFmpeg1.Cmake交叉编译Android动态库2.配置NDK环境2.1NDK中交叉编译工具的变化2.1.1.交叉编译工具位置的变化:3.手写FFmpeg编译脚本4.编译遇到的问题5.如何适配so框架6.编译参数传递7.运行调试音频解码避坑指南1.Cmake交叉编译Android动态库交叉编译:Linux上编译Android的sondk16的以上版本自带交叉编译工具链
Win7本地化部署deepseek-r1等大模型详解
mygodalien
语言模型 Windows7 本地化部署 大模型 llama
参考链接在Windows7操作系统,基于llama.cpp本地化部署deepseek-r1模型的方法2025-02-082G内存Windows7运行deepseek-r1:1.5b这两个链接写的可能不够详细,有同学私信问实现过程,这里进一步解释一下。一、准备需要准备的大模型、工具等文件,已放到网盘,可自取。网盘的figures目录是配置过程中的一些截图,可参考。百度网盘:https://pan.b
电脑文件防泄密系统
Tianrui Green Shield
天锐绿盾 电脑文件防泄密系统 办公加密软件 源代码防泄密 设计图纸图档保护 办公文件资料加密 电脑行为审计监控 文档安全管理
天锐绿盾电脑文件防泄密系统是一款专业的数据安全防护软件,旨在为企业和个人用户提供全方位的文件保密和防泄密解决方案。以下是对该系统的详细介绍:一、系统概述天锐绿盾防泄密系统通过先进的加密技术和精细的权限管理,确保企业内部的敏感文件在创建、存储、传输和使用过程中始终处于受控状态。该系统支持多种文件格式,如文档、图纸、源代码等,并能在不影响员工正常工作的前提下,实现文件的透明加密和自动解密。二、核心功能
ADF动态内容的使用:基于文件名过滤和增量加载
t0_54coder
编程问题解决手册 flask python 后端 个人开发
在使用AzureDataFactory(ADF)进行数据处理时,经常会遇到需要根据文件名中的日期进行过滤和增量加载的情况。本文将通过一个具体的例子,详细讲解如何在ADF中实现这一需求。背景介绍假设我们有一个FTP服务器,存储着每周更新的文件,这些文件的命名方式如下:a_2023-01-01.csvb_2023-01-01.csvc_2023-01-01.csv同时,这些文件也可能以.zip和.ok
前端如何安全存储密钥,防止信息泄露
m0_54804970
vip1024p 前端 安全 状态模式
场景把公钥硬编码在前端代码文件里,被公司安全检测到了要整改,于是整理几种常见的前端密钥存储方案。1.设置环境变量再读取在打包或部署前端应用时,可以将密钥配置为环境变量,在应用运行时通过环境变量读取密钥。这样可以将密钥从源代码中分离出来,避免意外泄露。a.前端设置环境变量将密钥作为前端应用的环境变量进行配置。但是直接使用环境变量存储密钥也是很危险的,前端代码可以被任何人查看和修改,这意味着敏感信息可
元宇宙展厅:真三维漫游+自由DIY创作+数字人互动
jimumeta
虚拟展厅 3D展厅 3d展厅 3d 元宇宙 虚拟展厅
在科技日新月异的今天,数字化转型已成为各行各业不可逆转的趋势。作为展示与交流的重要平台,展厅的形式也在不断创新,元宇宙展厅凭借其独特的真三维漫游体验、自由创作的DIY功能、炫酷的场景特效以及数字人互动社交,为用户带来了前所未有的展示与互动体验。真三维漫游,无死角体验在元宇宙展厅中,用户能够享受到全空间无死角的真三维漫游体验。这种体验突破了传统展厅的限制,无论是旋转、俯视还是调整视角高度,用户都能随
Python阶段小结:从零基础到项目实战的蜕变之旅
GHXX.
python 学习 笔记
️知识肌肉训练清单训练部位核心动作(知识点)动作标准(关键要点)基础代谢变量/数据类型、运算符、f-stringtype()类型检测,f"{value:.2f}"精度控制条件反射if-elif-else结构、逻辑运算符三目运算xifconditionelsey简化分支循环耐力while/for循环、range序列生成、break/continue嵌套循环实现矩阵遍历,enumerate获取索引功能
视创云展“虚拟展厅+数字人”,开启互动新体验!
jimumeta
虚拟展厅 虚拟现实 虚拟展厅 视创云展 3d 数字人 元宇宙 AI
在元宇宙的浪潮中,虚拟数字人以其独特的形态和巨大的潜力,正逐步在各个领域中崭露头角。在视创云展的虚拟展厅中,数字人更是凭借其拟人化的动作和智能化的沟通能力,为参观者带来了前所未有的互动体验。下面,我们将深入探讨虚拟数字人在虚拟展厅中的多样应用。智能导览:在虚拟展厅中,数字人担任着导览员的角色,为参观者提供精准的信息和指引。它们不仅能够帮助参观者更好地理解展厅内容,还能通过个性化的服务提升参观者的兴
Linux 上使用 Rust、Golang 和 C++ 进行应用开发比较
孽小倩
linux 开发语言 linux rust
作为一名前音视频编解码工程师,最常使用的语言是c/c++,但是永久了总想尝试下其他语言。rust一直被宣传为未来取代c++的语言,所以这次总结下golang,rust,与c++在linux开发应用时各自的优缺点,方便以后作出选择。这里从内存安全、性能、并发模型、生态系统、跨平台、开发体验这几个方面进行比较。1.内存安全语言内存安全Rust✅最安全(所有权&借用检查)Golang✅自动垃圾回收(GC
最新计算机专业开题报告案例84:基于Springboot框架的校园点餐系统的设计与实现
平姐设计
微信小程序项目实战 java项目实战 计算机毕业设计开题报告100套 spring boot java 校园点餐管理系统 餐厅管理 在线支付 开题报告 国内外研究现状
计算机毕业设计100套微信小程序项目实战java项目实战需要源码可以滴滴我请文末卡片dd我获取更详细的演示视频撰写不易,感谢支持!目录一、研究背景和意义1.1研究背景1.2研究意义二、国内外研究状况2.1后端技术2.1.1基于SpringBoot的校园点餐系统设计与实现2.1.2基于SpringMVC的校园点餐系统设计与实现2.1.3基于Mybatis的校园点餐系统设计与实现2.2前端技术2.2.
集合框架
天子之骄
java 数据结构 集合框架
集合框架
集合框架可以理解为一个容器,该容器主要指映射(map)、集合(set)、数组(array)和列表(list)等抽象数据结构。
从本质上来说,Java集合框架的主要组成是用来操作对象的接口。不同接口描述不同的数据类型。
简单介绍:
Collection接口是最基本的接口,它定义了List和Set,List又定义了LinkLi
Table Driven(表驱动)方法实例
bijian1013
java enum Table Driven 表驱动
实例一:
/**
* 驾驶人年龄段
* 保险行业,会对驾驶人的年龄做年龄段的区分判断
* 驾驶人年龄段:01-[18,25);02-[25,30);03-[30-35);04-[35,40);05-[40,45);06-[45,50);07-[50-55);08-[55,+∞)
*/
public class AgePeriodTest {
//if...el
Jquery 总结
cuishikuan
java jquery Ajax Web jquery方法
1.$.trim方法用于移除字符串头部和尾部多余的空格。如:$.trim(' Hello ') // Hello2.$.contains方法返回一个布尔值,表示某个DOM元素(第二个参数)是否为另一个DOM元素(第一个参数)的下级元素。如:$.contains(document.documentElement, document.body); 3.$
面向对象概念的提出
麦田的设计者
java 面向对象 面向过程
面向对象中,一切都是由对象展开的,组织代码,封装数据。
在台湾面向对象被翻译为了面向物件编程,这充分说明了,这种编程强调实体。
下面就结合编程语言的发展史,聊一聊面向过程和面向对象。
c语言由贝尔实
linux网口绑定
被触发
linux
刚在一台IBM Xserver服务器上装了RedHat Linux Enterprise AS 4,为了提高网络的可靠性配置双网卡绑定。
一、环境描述
我的RedHat Linux Enterprise AS 4安装双口的Intel千兆网卡,通过ifconfig -a命令看到eth0和eth1两张网卡。
二、双网卡绑定步骤:
2.1 修改/etc/sysconfig/network
XML基础语法
肆无忌惮_
xml
一、什么是XML?
XML全称是Extensible Markup Language,可扩展标记语言。很类似HTML。XML的目的是传输数据而非显示数据。XML的标签没有被预定义,你需要自行定义标签。XML被设计为具有自我描述性。是W3C的推荐标准。
二、为什么学习XML?
用来解决程序间数据传输的格式问题
做配置文件
充当小型数据库
三、XML与HTM
为网页添加自己喜欢的字体
知了ing
字体 秒表 css
@font-face {
font-family: miaobiao;//定义字体名字
font-style: normal;
font-weight: 400;
src: url('font/DS-DIGI-e.eot');//字体文件
}
使用:
<label style="font-size:18px;font-famil
redis范围查询应用-查找IP所在城市
矮蛋蛋
redis
原文地址:
http://www.tuicool.com/articles/BrURbqV
需求
根据IP找到对应的城市
原来的解决方案
oracle表(ip_country):
查询IP对应的城市:
1.把a.b.c.d这样格式的IP转为一个数字,例如为把210.21.224.34转为3524648994
2. select city from ip_
输入两个整数, 计算百分比
alleni123
java
public static String getPercent(int x, int total){
double result=(x*1.0)/(total*1.0);
System.out.println(result);
DecimalFormat df1=new DecimalFormat("0.0000%");
百合——————>怎么学习计算机语言
百合不是茶
java 移动开发
对于一个从没有接触过计算机语言的人来说,一上来就学面向对象,就算是心里上面接受的了,灵魂我觉得也应该是跟不上的,学不好是很正常的现象,计算机语言老师讲的再多,你在课堂上面跟着老师听的再多,我觉得你应该还是学不会的,最主要的原因是你根本没有想过该怎么来学习计算机编程语言,记得大一的时候金山网络公司在湖大招聘我们学校一个才来大学几天的被金山网络录取,一个刚到大学的就能够去和
linux下tomcat开机自启动
bijian1013
tomcat
方法一:
修改Tomcat/bin/startup.sh 为:
export JAVA_HOME=/home/java1.6.0_27
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.
export PATH=$JAVA_HOME/bin:$PATH
export CATALINA_H
spring aop实例
bijian1013
java spring AOP
1.AdviceMethods.java
package com.bijian.study.spring.aop.schema;
public class AdviceMethods {
public void preGreeting() {
System.out.println("--how are you!--");
}
}
2.beans.x
[Gson八]GsonBuilder序列化和反序列化选项enableComplexMapKeySerialization
bit1129
serialization
enableComplexMapKeySerialization配置项的含义
Gson在序列化Map时,默认情况下,是调用Key的toString方法得到它的JSON字符串的Key,对于简单类型和字符串类型,这没有问题,但是对于复杂数据对象,如果对象没有覆写toString方法,那么默认的toString方法将得到这个对象的Hash地址。
GsonBuilder用于
【Spark九十一】Spark Streaming整合Kafka一些值得关注的问题
bit1129
Stream
包括Spark Streaming在内的实时计算数据可靠性指的是三种级别:
1. At most once,数据最多只能接受一次,有可能接收不到
2. At least once, 数据至少接受一次,有可能重复接收
3. Exactly once 数据保证被处理并且只被处理一次,
具体的多读几遍http://spark.apache.org/docs/lates
shell脚本批量检测端口是否被占用脚本
ronin47
#!/bin/bash
cat ports |while read line
do#nc -z -w 10 $line
nc -z -w 2 $line 58422>/dev/null2>&1if[ $?-eq 0]then
echo $line:ok
else
echo $line:fail
fi
done
这里的ports 既可以是文件
java-2.设计包含min函数的栈
bylijinnan
java
具体思路参见:http://zhedahht.blog.163.com/blog/static/25411174200712895228171/
import java.util.ArrayList;
import java.util.List;
public class MinStack {
//maybe we can use origin array rathe
Netty源码学习-ChannelHandler
bylijinnan
java netty
一般来说,“有状态”的ChannelHandler不应该是“共享”的,“无状态”的ChannelHandler则可“共享”
例如ObjectEncoder是“共享”的, 但 ObjectDecoder 不是
因为每一次调用decode方法时,可能数据未接收完全(incomplete),
它与上一次decode时接收到的数据“累计”起来才有可能是完整的数据,是“有状态”的
p
java生成随机数
cngolon
java
方法一:
/**
* 生成随机数
* @author cngolon@126.com
* @return
*/
public synchronized static String getChargeSequenceNum(String pre){
StringBuffer sequenceNum = new StringBuffer();
Date dateTime = new D
POI读写海量数据
ctrain
海量数据
import java.io.FileOutputStream;
import java.io.OutputStream;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming
mysql 日期格式化date_format详细使用
daizj
mysql date_format 日期格式转换 日期格式化
日期转换函数的详细使用说明
DATE_FORMAT(date,format) Formats the date value according to the format string. The following specifiers may be used in the format string. The&n
一个程序员分享8年的开发经验
dcj3sjt126com
程序员
在中国有很多人都认为IT行为是吃青春饭的,如果过了30岁就很难有机会再发展下去!其实现实并不是这样子的,在下从事.NET及JAVA方面的开发的也有8年的时间了,在这里在下想凭借自己的亲身经历,与大家一起探讨一下。
明确入行的目的
很多人干IT这一行都冲着“收入高”这一点的,因为只要学会一点HTML, DIV+CSS,要做一个页面开发人员并不是一件难事,而且做一个页面开发人员更容
android欢迎界面淡入淡出效果
dcj3sjt126com
android
很多Android应用一开始都会有一个欢迎界面,淡入淡出效果也是用得非常多的,下面来实现一下。
主要代码如下:
package com.myaibang.activity;
import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.os.CountDown
linux 复习笔记之常见压缩命令
eksliang
tar解压 linux系统常见压缩命令 linux压缩命令 tar压缩
转载请出自出处:http://eksliang.iteye.com/blog/2109693
linux中常见压缩文件的拓展名
*.gz gzip程序压缩的文件
*.bz2 bzip程序压缩的文件
*.tar tar程序打包的数据,没有经过压缩
*.tar.gz tar程序打包后,并经过gzip程序压缩
*.tar.bz2 tar程序打包后,并经过bzip程序压缩
*.zi
Android 应用程序发送shell命令
gqdy365
android
项目中需要直接在APP中通过发送shell指令来控制lcd灯,其实按理说应该是方案公司在调好lcd灯驱动之后直接通过service送接口上来给APP,APP调用就可以控制了,这是正规流程,但我们项目的方案商用的mtk方案,方案公司又没人会改,只调好了驱动,让应用程序自己实现灯的控制,这不蛋疼嘛!!!!
发就发吧!
一、关于shell指令:
我们知道,shell指令是Linux里面带的
java 无损读取文本文件
hw1287789687
读取文件 无损读取 读取文本文件 charset
java 如何无损读取文本文件呢?
以下是有损的
@Deprecated
public static String getFullContent(File file, String charset) {
BufferedReader reader = null;
if (!file.exists()) {
System.out.println("getFull
Firebase 相关文章索引
justjavac
firebase
Awesome Firebase
最近谷歌收购Firebase的新闻又将Firebase拉入了人们的视野,于是我做了这个 github 项目。
Firebase 是一个数据同步的云服务,不同于 Dropbox 的「文件」,Firebase 同步的是「数据」,服务对象是网站开发者,帮助他们开发具有「实时」(Real-Time)特性的应用。
开发者只需引用一个 API 库文件就可以使用标准 RE
C++学习重点
lx.asymmetric
C++ 笔记
1.c++面向对象的三个特性:封装性,继承性以及多态性。
2.标识符的命名规则:由字母和下划线开头,同时由字母、数字或下划线组成;不能与系统关键字重名。
3.c++语言常量包括整型常量、浮点型常量、布尔常量、字符型常量和字符串性常量。
4.运算符按其功能开以分为六类:算术运算符、位运算符、关系运算符、逻辑运算符、赋值运算符和条件运算符。
&n
java bean和xml相互转换
q821424508
java bean xml xml和bean转换 java bean和xml转换
这几天在做微信公众号
做的过程中想找个java bean转xml的工具,找了几个用着不知道是配置不好还是怎么回事,都会有一些问题,
然后脑子一热谢了一个javabean和xml的转换的工具里,自己用着还行,虽然有一些约束吧 ,
还是贴出来记录一下
顺便你提一下下,这个转换工具支持属性为集合、数组和非基本属性的对象。
packag
C 语言初级 位运算
1140566087
位运算 c
第十章 位运算 1、位运算对象只能是整形或字符型数据,在VC6.0中int型数据占4个字节 2、位运算符: 运算符 作用 ~ 按位求反 << 左移 >> 右移 & 按位与 ^ 按位异或 | 按位或 他们的优先级从高到低; 3、位运算符的运算功能: a、按位取反: ~01001101 = 101
14点睛Spring4.1-脚本编程
wiselyman
spring4
14.1 Scripting脚本编程
脚本语言和java这类静态的语言的主要区别是:脚本语言无需编译,源码直接可运行;
如果我们经常需要修改的某些代码,每一次我们至少要进行编译,打包,重新部署的操作,步骤相当麻烦;
如果我们的应用不允许重启,这在现实的情况中也是很常见的;
在spring中使用脚本编程给上述的应用场景提供了解决方案,即动态加载bean;
spring支持脚本