HarmonyOS开发:基于http开源一个网络请求库

前言

网络封装的目的,在于简洁,使用起来更加的方便,也易于我们进行相关动作的设置,如果,我们不封装,那么每次请求,就会重复大量的代码逻辑,如下代码,是官方给出的案例:

// 引入包名
import http from '@ohos.net.http';

// 每一个httpRequest对应一个HTTP请求任务,不可复用
let httpRequest = http.createHttp();
// 用于订阅HTTP响应头,此接口会比request请求先返回。可以根据业务需要订阅此消息
// 从API 8开始,使用on('headersReceive', Callback)替代on('headerReceive', AsyncCallback)。 8+
httpRequest.on('headersReceive', (header) => {
    console.info('header: ' + JSON.stringify(header));
});
httpRequest.request(
    // 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
    "EXAMPLE_URL",
    {
        method: http.RequestMethod.POST, // 可选,默认为http.RequestMethod.GET
        // 开发者根据自身业务需要添加header字段
        header: {
            'Content-Type': 'application/json'
        },
        // 当使用POST请求时此字段用于传递内容
        extraData: {
            "data": "data to send",
        },
        expectDataType: http.HttpDataType.STRING, // 可选,指定返回数据的类型
        usingCache: true, // 可选,默认为true
        priority: 1, // 可选,默认为1
        connectTimeout: 60000, // 可选,默认为60000ms
        readTimeout: 60000, // 可选,默认为60000ms
        usingProtocol: http.HttpProtocol.HTTP1_1, // 可选,协议类型默认值由系统自动指定
    }, (err, data) => {
        if (!err) {
            // data.result为HTTP响应内容,可根据业务需要进行解析
            console.info('Result:' + JSON.stringify(data.result));
            console.info('code:' + JSON.stringify(data.responseCode));
            // data.header为HTTP响应头,可根据业务需要进行解析
            console.info('header:' + JSON.stringify(data.header));
            console.info('cookies:' + JSON.stringify(data.cookies)); // 8+
            // 取消订阅HTTP响应头事件
            httpRequest.off('headersReceive');
            // 当该请求使用完毕时,调用destroy方法主动销毁
            httpRequest.destroy();
        } else {
            console.info('error:' + JSON.stringify(err));
            // 取消订阅HTTP响应头事件
            httpRequest.off('headersReceive');
            // 当该请求使用完毕时,调用destroy方法主动销毁。
            httpRequest.destroy();
        }
    }
);

以上的案例,每次请求书写这么多代码,在实际的开发中,是无法承受的,所以基于此,封装是很有必要的,把公共的部分进行抽取包装,固定不变的参数进行初始化设置,重写基本的请求方式,这是我们封装的基本宗旨。

我们先看一下封装之后的调用方式:

异步请求

Net.get("url").requestString((data) => {
  //data 为 返回的json字符串
})

同步请求

const data = await Net.get("url").returnData<string>(ReturnDataType.STRING)
//data 为 返回的json字符串

装饰器请求

@GET("url")
private getData():Promise<string> {
  return null
}

封装之后,不仅使用起来更加的便捷,而且还拓展了请求类型,满足不同需求的场景。

本篇的文章内容大致如下:

1、net库主要功能点介绍

2、net库快速依赖使用

3、net库全局初始化

4、异步请求介绍

5、同步请求介绍

6、装饰器请求介绍

7、上传下载介绍

8、Dialog加载使用

9、相关总结

一、net库主要功能点介绍

目前net库一期已经开发完毕,har包使用,大家可以看第二项,截止到发文前,所支持的功能如下:

■ 支持全局初始化

■ 支持统一的BaseUrl

■ 支持全局错误拦截

■ 支持全局头参拦截

■ 支持同步方式请求(get/post/delete/put/options/head/trace/connect)

■ 支持异步方式请求(get/post/delete/put/options/head/trace/connect)

■ 支持装饰器方式请求(get/post/delete/put/options/head/trace/connect)

■ 支持dialog加载

■ 支持返回Json字符串

■ 支持返回对象

■ 支持返回数组

■ 支持返回data一层数据

■ 支持上传文件

■ 支持下载文件

□ 数据缓存开发中……

二、net库快速依赖使用

私服和远程依赖,由于权限和审核问题,预计需要等到2024年第一季度面向所有开发者,所以,只能使用本地静态共享包和源码 两种使用方式,本地静态共享包类似Android中的aar依赖,直接复制到项目中即可,目前源码还在优化中,先暴露静态共享包这一使用方式。

本地静态共享包har包使用

首先,下载har包,点击下载

下载之后,把har包复制项目中,目录自己创建,如下,我创建了一个libs目录,复制进去

引入之后,进行同步项目,点击Sync Now即可,当然了你也可以,将鼠标放置在报错处会出现提示,在提示框中点击Run 'ohpm install'

需要注意,@app/net,是用来区分目录的,可以自己定义,比如@aa/bb等,关于静态共享包的创建和使用,请查看如下我的介绍,这里就不过多介绍。

HarmonyOS开发:走进静态共享包的依赖与使用

查看是否引用成功

无论使用哪种方式进行依赖,最终都会在使用的模块中,生成一个oh_modules文件,并创建源代码文件,有则成功,无则失败,如下:

三、net库全局初始化

推荐在AbilityStage进行初始化,初始化一次即可,初始化参数可根据项目需要进行选择性使用。

Net.getInstance().init({
  baseUrl: "https://www.vipandroid.cn", //设置全局baseurl
  connectTimeout: 10000, //设置连接超时
  readTimeout: 10000, //设置读取超时
  netErrorInterceptor: new MyNetErrorInterceptor(), //设置全局错误拦截,需要自行创建,可在这里进行错误处理
  netHeaderInterceptor: new MyNetHeaderInterceptor(), //设置全局头拦截器,需要自行创建
  header: {}, //头参数
  resultTag: []//接口返回数据参数,比如data,items等等
})

1、初始化属性介绍

初始化属性,根据自己需要选择性使用。

属性

类型

概述

baseUrl

string

一般标记为统一的请求前缀,也就是域名

connectTimeout

number

连接超时,默认10秒

readTimeout

number

读取超时,默认10秒

netErrorInterceptor

INetErrorInterceptor

全局错误拦截器,需继承INetErrorInterceptor

netHeaderInterceptor

INetHeaderInterceptor

全局请求头拦截器,需继承INetHeaderInterceptor

header

Object

全局统一的公共头参数

resultTag

Array

接口返回数据参数,比如data,items等等

 

2、设置请求头拦截

关于全局头参数传递,可以通过以上的header参数或者在请求头拦截里均可,如果没有同步等逻辑操作,只是固定的头参数,建议直接使用header参数。

名字自定义,实现INetHeaderInterceptor接口,可在netHeader方法里打印请求头或者追加请求头。

import { HttpHeaderOptions, NetHeaderInterceptor } from '@app/net'

class MyNetHeaderInterceptor implements NetHeaderInterceptor {
  getHeader(options: HttpHeaderOptions): Promise<Object> {
    //可以进行接口签名,传入头参数
    return null
  }
}

HttpHeaderOptions对象

返回了一些常用参数,可以用于接口签名等使用。

export class HttpHeaderOptions {
  url?: string //请求地址
  method?: http.RequestMethod //请求方式
  header?: Object //头参数
  params?: Object //请求参数
}

3、设置全局错误拦截器

名字自定义,实现INetErrorInterceptor接口,可在httpError方法里进行全局的错误处理,比如统一跳转,统一提示等。

import { NetError } from '@app/net/src/main/ets/error/NetError';
import { INetErrorInterceptor } from '@app/net/src/main/ets/interceptor/INetErrorInterceptor';

export class MyNetErrorInterceptor implements INetErrorInterceptor {
  httpError(error: NetError) {
    //这里进行拦截错误信息

  }
}

NetError对象

可通过如下方法获取错误code和错误描述信息。

/*
   * 返回code
   * */
getCode():number{
  return this.code
}

/*
* 返回message
* */
getMessage():string{
  return this.message
}

四、异步请求介绍

1、请求说明

为了方便数据的针对性返回,目前异步请求提供了三种请求方法,在实际的 开发中,大家可以针对需要,选择性使用。

request方法

Net.get("url").request<TestModel>((data) => {
  //data 就是返回的TestModel对象
})

此方法,针对性返回对应的data数据对象,如下json,则会直接返回需要的data对象,不会携带外层的code等其他参数,方便大家直接的拿到数据。

{
  "code": 0,
  "message": "数据返回成功",
  "data": {}
}

如果你的data是一个数组,如下json:

{
  "code": 0,
  "message": "数据返回成功",
  "data": []
}

数组获取

Net.get("url").request<TestModel[]>((data) => {
  //data 就是返回的TestModel[]数组
})

//或者如下

Net.get("url").request<Array<TestModel>>((data) => {
  //data 就是返回的TestModel数组
})

可能大家有疑问,如果接口返回的json字段不是data怎么办?如下:

举例一

{
  "code": 0,
  "message": "数据返回成功",
  "items": {}
}

举例二

{
  "code": 0,
  "message": "数据返回成功",
  "models": {}
}

虽然网络库中默认取的是json中的data字段,如果您的数据返回类型字段有多种,如上json,可以通过全局初始化resultTag进行传递或者局部setResultTag传递即可。

全局设置接口返回数据参数【推荐】

全局设置,具体设置请查看上边的全局初始化一项,只设置一次即可,不管你有多少种返回参数,都可以统一设置。

 Net.getInstance().init({
  resultTag: ["data", "items", "models"]//接口返回数据参数,比如data,items等等
})

局部设置接口返回数据参数

通过setResultTag方法设置即可。

Net.get("")
  .setResultTag(["items"])
  .request<TestModel>((data) => {

  })

requestString方法

requestString就比较简单,就是普通的返回请求回来的json字符串。

Net.get("url").requestString((data) => {
  //data 为 返回的json字符串
})

requestObject方法

requestObject方法也是获取对象,和request不同的是,它不用设置返回参数,因为它是返回的整个json对应的对象, 也就是包含了code,message等字段。

Net.get("url").requestObject<TestModel>((data) => {
  //data 为 返回的TestModel对象
})

为了更好的复用共有字段,你可以抽取一个基类,如下:

export class ApiResult<T> {
  code: number
  message: string
  data: T
}

以后就可以如下请求:

Net.get("url").requestObject<ApiResult<TestModel>>((data) => {
  //data 为 返回的ApiResult对象
})

回调函数

回调函数有两个,一个成功一个失败,成功回调必调用,失败可选择性调用。

只带成功

Net.get("url").request<TestModel>((data) => {
  //data 为 返回的TestModel对象
})

成功失败都带

Net.get("url").request<TestModel>((data) => {
  //data 为 返回的TestModel对象
}, (error) => {
  //失败
})

2、get请求

 Net.get("url").request<TestModel>((data) => {
  //data 为 返回的TestModel对象
})

3、post请求

Net.post("url").request<TestModel>((data) => {
  //data 为 返回的TestModel对象
})

4、delete请求

 Net.delete("url").request<TestModel>((data) => {
  //data 为 返回的TestModel对象
})

5、put请求

Net.put("url").request<TestModel>((data) => {
  //data 为 返回的TestModel对象
})

6、其他请求方式

除了常见的请求之外,根据系统api所提供的,也封装了如下的请求方式,只需要更改请求方式即可,比如Net.options。

OPTIONS
HEAD
TRACE
CONNECT

7、各个方法调用

除了正常的请求方式之外,你也可以调用如下的参数:

方法

类型

概述

setHeaders

Object

单独添加请求头参数

setBaseUrl

string

单独替换BaseUrl

setParams

string / Object / ArrayBuffer

单独添加参数,用于post

setConnectTimeout

number

单独设置连接超时

setReadTimeout

number

单独设置读取超时

setExpectDataType

http.HttpDataType

设置指定返回数据的类型

setUsingCache

boolean

使用缓存,默认为true

setPriority

number

设置优先级 默认为1

setUsingProtocol

http.HttpProtocol

协议类型默认值由系统自动指定

setResultTag

Array

接口返回数据参数,比如data,items等等

setContext

Context

设置上下文,用于下载文件

setCustomDialogController

CustomDialogController

传递的dialog控制器,用于展示dialog

代码调用如下:

Net.get("url")
  .setHeaders({})//单独添加请求头参数
  .setBaseUrl("")//单独替换BaseUrl
  .setParams({})//单独添加参数
  .setConnectTimeout(10000)//单独设置连接超时
  .setReadTimeout(10000)//单独设置读取超时
  .setExpectDataType(http.HttpDataType.OBJECT)//设置指定返回数据的类型
  .setUsingCache(true)//使用缓存,默认为true
  .setPriority(1)//设置优先级 默认为1
  .setUsingProtocol(http.HttpProtocol.HTTP1_1)//协议类型默认值由系统自动指定
  .setResultTag([""])//接口返回数据参数,比如data,items等等
  .setContext(this.context)//设置上下文,用于上传文件和下载文件
  .setCustomDialogController()//传递的dialog控制器,用于展示dialog
  .request<TestModel>((data) => {
    //data 为 返回的TestModel对象
  })

五、同步请求介绍

同步请求需要注意,需要await关键字和async关键字结合使用。

 private async getTestModel(){
  const testModel = await Net.get("url").returnData<TestModel>()
}

1、请求说明

同步请求和异步请求一样,也是有三种方式,是通过参数的形式,默认直接返回data层数据。

返回data层数据

和异步种的request方法类似,只返回json种的data层对象数据,不会返回code等字段。

 private async getData(){
  const data = await Net.get("url").returnData<TestModel>()
  //data为 返回的 TestModel对象
}

返回Json对象

和异步种的requestObject方法类似,会返回整个json对象,包含code等字段。

 private async getData(){
  const data = await Net.get("url").returnData<TestModel>(ReturnDataType.OBJECT)
  //data为 返回的 TestModel对象
}

返回Json字符串

和异步种的requestString方法类似。

private async getData(){
  const data = await Net.get("url").returnData<string>(ReturnDataType.STRING)
  //data为 返回的 json字符串
}

返回错误

异步方式有回调错误,同步方式如果发生错误,也会直接返回错误,结构如下:

{
  "code": 0,
  "message": "错误信息"
}

除了以上的错误捕获之外,你也可以全局异常捕获,

2、get请求


const data = await Net.get("url").returnData<TestModel>()

3、post请求


const data = await Net.post("url").returnData<TestModel>()

4、delete请求


const data = await Net.delete("url").returnData<TestModel>()

5、put请求


const data = await Net.put("url").returnData<TestModel>()

6、其他请求方式

除了常见的请求之外,根据系统api所提供的,也封装了如下的请求方式,只需要更改请求方式即可,比如Net.options

OPTIONS
HEAD
TRACE
CONNECT

7、各个方法调用

除了正常的请求方式之外,你也可以调用如下的参数:

方法

类型

概述

setHeaders

Object

单独添加请求头参数

setBaseUrl

string

单独替换BaseUrl

setParams

string / Object / ArrayBuffer

单独添加参数,用于post

setConnectTimeout

number

单独设置连接超时

setReadTimeout

number

单独设置读取超时

setExpectDataType

http.HttpDataType

设置指定返回数据的类型

setUsingCache

boolean

使用缓存,默认为true

setPriority

number

设置优先级 默认为1

setUsingProtocol

http.HttpProtocol

协议类型默认值由系统自动指定

setResultTag

Array

接口返回数据参数,比如data,items等等

setContext

Context

设置上下文,用于下载文件

setCustomDialogController

CustomDialogController

传递的dialog控制器,用于展示dialog

代码调用如下:

const data = await Net.get("url")
  .setHeaders({})//单独添加请求头参数
  .setBaseUrl("")//单独替换BaseUrl
  .setParams({})//单独添加参数
  .setConnectTimeout(10000)//单独设置连接超时
  .setReadTimeout(10000)//单独设置读取超时
  .setExpectDataType(http.HttpDataType.OBJECT)//设置指定返回数据的类型
  .setUsingCache(true)//使用缓存,默认为true
  .setPriority(1)//设置优先级 默认为1
  .setUsingProtocol(http.HttpProtocol.HTTP1_1)//协议类型默认值由系统自动指定
  .setResultTag([""])//接口返回数据参数,比如data,items等等
  .setContext(this.context)//设置上下文,用于上传文件和下载文件
  .setCustomDialogController()//传递的dialog控制器,用于展示dialog
  .returnData<TestModel>()
//data为 返回的 TestModel对象

六、装饰器请求介绍

网络库允许使用装饰器的方式发起请求,也就是通过注解的方式,目前采取的是装饰器方法的形式。

1、请求说明

装饰器和同步异步有所区别,只返回两种数据类型,一种是json字符串,一种是json对象,暂时不提供返回data层数据。 在使用的时候,您可以单独创建工具类或者ViewModel或者直接使用,都可以。

返回json字符串

@GET("url")
private getData():Promise<string> {
  return null
}

返回json对象

@GET("url")
private getData():Promise<TestModel> {
  return null
}

2、get请求

@GET("url")
private getData():Promise<TestModel> {
  return null
}

3、post请求

@POST("url")
private getData():Promise<TestModel> {
  return null
}

4、delete请求

@DELETE("url")
private getData():Promise<TestModel> {
  return null
}

5、put请求

@PUT("url")
private getData():Promise<TestModel> {
  return null
}

6、其他请求方式

除了常见的请求之外,根据系统api所提供的,也封装了如下的请求方式,只需要更改请求方式即可,比如@OPTIONS。

OPTIONS
HEAD
TRACE
CONNECT

当然,大家也可以使用统一的NET装饰器,只不过需要自己设置请求方法,代码如下:

@NET("url", { method: http.RequestMethod.POST })
private getData():Promise<string> {
  return null
}

7、装饰器参数传递

直接参数传递

直接参数,在调用装饰器请求时,后面添加即可,一般针对固定参数。

@GET("url", {
  baseUrl: "", //baseUrl
  header: {}, //头参数
  params: {}, //入参
  connectTimeout: 1000, //连接超时
  readTimeout: 1000, //读取超时
  isReturnJson: true//默认false 返回Json字符串,默认返回json对象
})
private getData():Promise<string> {
  return null
}

动态参数传递

动态参数适合参数可变的情况下传递,比如分页等情况。

@GET("url")
private getData(data? : HttpOptions):Promise<string> {
  return null
}

调用时传递

private async doHttp(){
  const data = await this.getData({
    baseUrl: "", //baseUrl
    header: {}, //头参数
    params: {}, //入参
    connectTimeout: 1000, //连接超时
    readTimeout: 1000, //读取超时
    isReturnJson: true//默认false 返回Json字符串,默认返回json对象
  })
}

装饰器参数传递

使用DATA装饰器,DATA必须在上!

@DATA({
  baseUrl: "", //baseUrl
  header: {}, //头参数
  params: {}, //入参
  connectTimeout: 1000, //连接超时
  readTimeout: 1000, //读取超时
  isReturnJson: true//默认false 返回Json字符串,默认返回json对象
})
@GET("url")
private getData():Promise<string> {
  return null
}

七、上传下载介绍

1、上传文件

Net.uploadFile("")//上传的地址
  .setUploadFiles([])//上传的文件 [{ filename: "test", name: "test", uri: "internal://cache/test.jpg", type: "jpg" }]
  .setUploadData([])//上传的参数 [{ name: "name123", value: "123" }]
  .setProgress((receivedSize, totalSize) => {
    //监听上传进度
  })
  .request((data) => {
    if (data == UploadTaskState.COMPLETE) {
      //上传完成
    }
  })

方法介绍

方法

类型

概述

uploadFile

string

上传的地址

setUploadFiles

Array

上传的文件数组

setUploadData

Array

上传的参数数组

setProgress

回调函数

监听进度,receivedSize下载大小, totalSize总大小

request

请求上传,data类型为UploadTaskState,有三种状态:START(开始),COMPLETE(完成),ERROR(错误)

其他方法

删除上传进度监听

uploadRequest.removeProgressCallback()

删除上传任务

uploadRequest.deleteUploadTask((result) => {
  if (result) {
    //成功
  } else {
    //失败
  }
})

2、下载文件

Net.downLoadFile("http://10.47.24.237:8888/harmony/log.har")
  .setContext(EntryAbility.context)
  .setFilePath(EntryAbility.filePath)
  .setProgress((receivedSize, totalSize) => {
    //监听下载进度
  })
  .request((data) => {
    if (data == DownloadTaskState.COMPLETE) {
      //下载完成
    }
  })

方法介绍

方法

类型

概述

downLoadFile

string

下载的地址

setContext

Context

上下文

setFilePath

string

下载后保存的路径

setProgress

回调函数

监听进度,receivedSize下载大小, totalSize总大小

request

请求下载,data类型为DownloadTaskState,有四种状态:START(开始),COMPLETE(完成),PAUSE(暂停),REMOVE(结束)

其他方法

移除下载的任务

    downLoadRequest.deleteDownloadTask((result) => {
  if (result) {
    //移除成功
  } else {
    //移除失败
  }
})

暂停下载任务

downLoadRequest.suspendDownloadTask((result) => {
  if (result) {
    //暂停成功
  } else {
    //暂停失败
  }
})

重新启动下载任务

downLoadRequest.restoreDownloadTask((result) => {
  if (result) {
    //成功
  } else {
    //失败
  }
})

删除监听下载进度

downLoadRequest.removeProgressCallback()

八、Dialog加载使用

1、定义dialog控制器

NetLoadingDialog是net包中自带的,菊花状弹窗,如果和实际业务不一致,可以更换。

private mCustomDialogController = new CustomDialogController({
  builder: NetLoadingDialog({
    loadingText: '请等待...'
  }),
  autoCancel: false,
  customStyle: true
})

2、调用传递控制器方法

此方法会自动显示和隐藏dialog,如果觉得不合适,大家可以自己定义即可。

setCustomDialogController(this.mCustomDialogController)

九、相关总结

开发环境如下:

DevEco Studio 4.0 Beta2,Build Version: 4.0.0.400

Api版本:9

hvigorVersion:3.0.2

目前呢,暂时不支持缓存,后续会逐渐加上,大家在使用的过程中,需要任何的问题,都可以进行反馈,都会第一时间进行解决。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS3背景样式

在CSS 2.1中&#xff0c;background属性的功能还无法满足设计的需求&#xff0c;为了方便设计师更灵活地设计需要的网页效果&#xff0c;CSS3在原有background基础上新增了一些功能属性&#xff0c;可以在同一个对象内叠加多个背景图像&#xff0c;可以改变背景图像的大小尺寸&…

nodelist 与 HTMLCollection 的区别

原地址 https://cloud.tencent.com/developer/article/2013289 节点与元素 根据 W3C 的 HTML DOM 标准&#xff0c;HTML 文档中的所有内容都是节点&#xff1a; 整个文档是一个文档节点每个 HTML 元素是元素节点HTML 元素内的文本是文本节点每个 HTML 属性是属性节点注释是注…

基于C语言实现扫雷小游戏

扫雷游戏 1. 扫雷游戏分析和设计1.1 扫雷游戏的功能说明1.2 游戏的分析和设计1.2.1 数据结构的分析 2. 扫雷游戏的代码实现3. 扫雷游戏的扩展 1. 扫雷游戏分析和设计 1.1 扫雷游戏的功能说明 使用控制台实现经典的扫雷游戏 游戏可以通过菜单实现继续玩或者退出游戏 扫雷的棋…

【考研数学】概率论与数理统计 —— 第七章 | 参数估计(2,参数估计量的评价、正态总体的区间估计)

文章目录 一、参数估计量的评价标准1.1 无偏性1.2 有效性1.3 一致性 二、一个正态总体参数的双侧区间估计2.1 对参数 μ \mu μ 的双侧区间估计 三、一个正态总体的单侧置信区间四、两个正态总体的双侧置信区间写在最后 一、参数估计量的评价标准 1.1 无偏性 设 X X X 为总…

技能证里的天花板—阿里云云计算架构师ACE认证!

在当今的社会中&#xff0c;想要获得一份好工作、得到丰厚的报酬&#xff0c;唯一的方法就是证明自己优秀&#xff0c;能给公司创造价值&#xff0c;是大多数公司想要看到的。 那么在面试过程中&#xff0c;怎么样才能让面试官一眼就记住呢&#xff1f;那一定是有一份足够优秀…

JVM虚拟机:JVM的垃圾回收清除算法(GC)有哪些

垃圾回收清除算法 引用计数法 标记清除 拷贝算法 标记压缩 引用计数法 有一个引用指向对象,那么引用计数就加1,少一个引用指向,那么引用计数就减1,这种方法了解一下就好,JVM机会不会使用这种方法,因为它在每次对象赋值的时候都要维护引用计数器,且计数器本身也有一定的…

JAVA虚拟机-第2章 Java自动内存管理-异常实践

Java堆溢出 堆的参数设置&#xff1a;将堆的最小值-Xms参数与最大值-Xmx参数设置 public class HeapOOM {static class OOMObject {}public static void main(String[] args) {List<OOMObject> list new ArrayList<OOMObject>();while (true) {list.add(new OO…

idea 配置checkstyle全过程

checkstyle是提高代码质量,检查代码规范的很好用的一款工具&#xff0c;本文简单介绍一下集成的步骤&#xff0c;并提供一份完整的checkstyle的代码规范格式文件&#xff0c;以及常见的格式问题的解决方法。 一&#xff0c;安装 打开idea的文件选项&#xff0c;选择设置&…

Unity3D实现页面的滑动切换功能

效果展示 Unity3D实现页面的滑动切换 效果 文章目录 前言一、先上代码二、创建UI1.创建Scroll View如下图&#xff0c;并挂载该脚本&#xff1a;2.Content下创建几个Itme 总结 前言 好记性不如烂笔头&#xff01; 一、先上代码 /*******************************************…

前端性能分析工具

前段时间在工作中,需要判断模块bundle size缩减对页面的哪些性能产生了影响, 因此需要了解前端的性能指标如何定义的,以及前端有哪些性能分析工具, 于是顺便整理了一篇笔记, 以供前端小白对性能这块知识点做一个入门级的了解. 页面渲染 在了解性能指标和分析工具之前,有必要先…

怎样去除视频中的杂音,保留人声部分?

怎样去除视频中的杂音&#xff0c;保留人声部分&#xff1f;这个简单嘛&#xff01;两种办法可以搞定&#xff1a;一是进行音频降噪&#xff0c;把无用的杂音消除掉&#xff1b;二是提取人声&#xff0c;将要保留的人声片段提取出来。 这就将两种实用的办公都分享出来&#xf…

datagrip出现 java.net.ConnectException: Connection refused: connect.

出现这样的情况要看一下hadoop有没有启动 start-all.sh nohup /export/server/apache-hive-3.1.2-bin/bin/hive --service hiveserver2 & scp -r /export/server/apache-hive-3.1.2-bin/ node3:/export/server/ /export/server/apache-hive-3.1.2-bin/bin/hive show databa…

Apache POI

文章目录 一、Apache POI介绍二、应用场景三、使用步骤1.导入maven坐标2.写入代码讲解3.读取代码讲解 一、Apache POI介绍 Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是&#xff0c;我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文…

pytorch 笔记:GRU

1 介绍 对于输入序列中的每个元素&#xff0c;每一层都计算以下函数&#xff1a; ht​ 是t时刻 的隐藏状态xt​ 是t时刻 的输入ht−1​ 是 t-1时刻 同层的隐藏状态或 0时刻 的初始隐藏状态rt​,zt​,nt​ 分别是重置门、更新门和新门。σ 是 sigmoid 函数∗ 是 Hadamard 乘积。…

coalesce函数(SQL )

用途&#xff1a; 将控制替换成其他值&#xff1b;返回第一个非空值 表达式 COALESCE是一个函数&#xff0c; (expression_1, expression_2, …,expression_n)依次参考各参数表达式&#xff0c;遇到非null值即停止并返回该值。如果所有的表达式都是空值&#xff0c;最终将返…

HarmonyOS鸿蒙原生应用开发设计- 元服务(原子化服务)图标

HarmonyOS设计文档中&#xff0c;为大家提供了独特的元服务图标&#xff0c;开发者可以根据需要直接引用。 开发者直接使用官方提供的元服务图标内容&#xff0c;既可以符合HarmonyOS原生应用的开发上架运营规范&#xff0c;又可以防止使用别人的元服务图标侵权意外情况等&…

关于网络编程的3个问题

一、TCP 和 UDP 可以同时绑定相同的端口吗&#xff1f; 答案&#xff1a;可以的 在数据链路层中&#xff0c;通过 MAC 地址来寻找局域网中的主机。在网络层中&#xff0c;通过 IP 地址来寻找网络中互连的主机或路由器。在传输层中&#xff0c;需要通过端口进行寻址&#xff0…

SpringCloud(五) Eureka与Nacos的区别

SpringCloud(二) Eureka注册中心的使用-CSDN博客 SpringCloud(四) Nacos注册中心-CSDN博客 在这两篇博文中我们详细讲解了Eureka和Nacos分别作为微服务的注册中心的使用方法和注意事项,但是两者之间也有一些区别. 一, Nacos实例分类 Nacos实例分为两种类型: 临时实例:如果实例…

[common c/c++] ring buffer/circular buffer 环形队列/环形缓冲区

前言&#xff1a; ring buffer / circular buffer 又名环形队列 / 环形缓冲区&#xff0c;其通过开辟固定尺寸的内存来实现反复复用同一块内存的目的。由于预先开辟了固定尺寸的内容&#xff0c;所以当数据满的时候&#xff0c;可以有两种处理方式&#xff0c;具体使用哪一种按…

思路视野杂志思路视野杂志社思路视野编辑部2023年第24期目录

公共文化 公共图书馆文旅融合实践与模式思考 白雪1-3 公共图书馆管理与服务创新路径分析 陈静4-6 提升办公室文书档案管理工作的实践探讨 黄强7-9 《思路视野》投稿邮箱&#xff1a;cn7kantougao163.com(注明投稿“《思路视野》”) 崔编辑Q Q &#xff1a;296078736 微信号&am…