屏幕 Dimensions

获取屏幕信息

import { Dimensions } from "react-native";
export default function demo() {const { width, height, scale, fontScale } = Dimensions.get("window");console.log(width, height, scale, fontScale);
}
  • 参数为 window 时,不包含顶部状态栏的高度
  • 参数为 screen 时,包含顶部状态栏的高度
  • 沉浸模式时,会状态栏状态栏,此时传参 window 和 screen 效果相同

监听屏幕变化

import { useEffect } from "react";
import { Dimensions } from "react-native";
export default function Demo() {useEffect(() => {// 添加监听const listener = Dimensions.addEventListener("change",({ window, screen }) => {console.log(window, screen);});return () => {// 移除监听listener.remove();};}, []);
}

平台 Platform

import { Platform, StyleSheet } from "react-native";
export default function Demo() {// 获取手机的操作系统console.log(Platform.OS); // ios or android or web or macos or tvos or windows or xbm// 获取手机的操作系统版本console.log(Platform.Version);// 获取手机品牌等底层信息console.log(Platform.constants);// 仅ios支持,判断是否是ipadconsole.log(Platform.isPad);// 判断是否是tvconsole.log(Platform.isTV);
}
const styles = StyleSheet.create({container: {// 随平台变化,动态设置样式...Platform.select({ios: { backgroundColor: "red" }, // ios平台的样式android: { backgroundColor: "blue" }, // android平台的样式web: { backgroundColor: "green" }, // web平台的样式}),},
});

样式 StyleSheet

import { StyleSheet } from "react-native";

定义样式 StyleSheet.create

const styles = StyleSheet.create({container: {flex: 1,alignItems: "center",justifyContent: "center",},
});

样式合并 StyleSheet.compose

计算结果为一个数组,但比直接写数组性能更好(因为多次使用时,不会重复生成数组对象)

  const style1 = {color: "red", // 红色};const style2 = {fontSize: 20, // 字号};const style3 = StyleSheet.compose(style1, style2);console.log(style3); // console.log(style3); //  [{"color": "red"}, {"fontSize": 20}]

样式平铺 StyleSheet.flatten

计算结果为一个对象,相同的样式会去重

  const style1 = {color: "red", // 红色};const style2 = {fontSize: 20, // 字号};const style3 = StyleSheet.flatten([style1, style2]);console.log(style3); //  {"color": "red", "fontSize": 20}

铺满全屏 StyleSheet.absoluteFill

为如下样式的简写,样式效果为铺满全屏

{"bottom": 0, "left": 0, "position": "absolute", "right": 0, "top": 0}

1 像素 StyleSheet.hairlineWidth

常用于很细小的分割线

console.log(StyleSheet.hairlineWidth); // 0.38095238095238093

为计算 1 像素的简写方式

1/Dimensions.get("screen").scale;

外链 Linking

打开外链 Linking.openURL

// 打开网页
Linking.openURL('https://example.com');// 拨打电话
Linking.openURL('tel:10086');// 发送短信
Linking.openURL('sms:10086');// 发送邮件
Linking.openURL('mailto:support@example.com?subject=Feedback&body=Hello');

打开地图定位

import { Linking } from 'react-native';// 经纬度定位(示例:北京天安门)
const latitude = 39.9042;
const longitude = 116.4074;
const label = '天安门广场';// 构建通用地理 URI
const url = Platform.select({ios: `maps://app?saddr&daddr=${latitude},${longitude}(${label})`,android: `geo:${latitude},${longitude}?q=${latitude},${longitude}(${label})`,
});Linking.openURL(url).catch(err => console.error('无法打开地图:', err));

打开其他应用

import { Linking } from 'react-native';// 检查应用是否安装
Linking.canOpenURL('应用协议://').then(supported => {if (supported) {// 可以打开// 打开应用Linking.openURL('应用协议://功能路径?参数=值');} else {// 未安装或不支持}});

实战范例

// 微信
Linking.openURL('weixin://');  // 打开微信
Linking.openURL('weixin://dl/business/?t=特定业务码');  // 打开微信特定业务// QQ
Linking.openURL('mqq://');  // 打开QQ
Linking.openURL('mqq://im/chat?chat_type=wpa&uin=123456789');  // 打开QQ聊天// 微博
Linking.openURL('sinaweibo://');  // 打开微博
Linking.openURL('sinaweibo://userinfo?uid=用户ID');  // 打开用户主页// 支付宝
Linking.openURL('alipay://');  // 打开支付宝
Linking.openURL('alipayqr://platformapi/startapp?saId=10000007');  // 打开扫一扫// 银联
Linking.openURL('uppay://');  // 打开银联

判断是否能打开外链 Linking.openURL

// 检查是否可以打开网页链接
Linking.canOpenURL('https://example.com').then(supported => {if (supported) {Linking.openURL('https://example.com');} else {console.log('无法打开此链接');// 可以提供备选方案,如显示错误信息}}).catch(err => console.error('检查链接时出错:', err));

打开应用设置 Linking.openSettings

// 打开应用的系统设置页面
Linking.openSettings().catch(err => console.error('无法打开设置:', err));

获取应用启动时的初始链接 Linking.getInitialURL

// 异步获取初始链接
async function getLaunchURL() {try {const url = await Linking.getInitialURL();if (url) {console.log('应用通过链接启动:', url);// 处理链接参数handleDeepLink(url);} else {console.log('应用正常启动,无初始链接');}} catch (error) {console.error('获取初始链接失败:', error);}
}

【Android 特有】Linking.sendIntent

功能Linking.openURLLinking.sendIntent
平台支持iOS 和 Android仅 Android
调用方式通过 URL Scheme(如 weixin://通过 Android Intent Action
参数灵活性只能传递简单 URL 参数可传递复杂数据(如 URI、Bundle)
适用场景打开网页、应用或执行通用操作精确控制 Android 组件启动
Linking.sendIntent(action, extras).then(success => console.log('Intent 发送成功:', success)).catch(error => console.error('Intent 发送失败:', error));
  • action 必要,字符串类型,表示 Intent 的动作,常见值如下:

    'android.intent.action.VIEW'          // 查看内容
    'android.intent.action.SEND'          // 分享内容
    'android.intent.action.DIAL'          // 拨号
    'android.intent.action.CAMERA_BUTTON' // 相机按钮
    
  • extras 可选,对象类型,包含传递给 Intent 的额外数据

    {type: 'text/plain',               // MIME 类型packageName: 'com.example.app',   // 目标应用包名flags: 0x10000000,                // Intent 标志位uri: 'content://path/to/file',    // 数据 URItext: '分享的文本内容',           // 文本数据// 其他自定义键值对
    }
    

分享文本内容

Linking.sendIntent('android.intent.action.SEND',{type: 'text/plain',text: '这是一段要分享的文本',subject: '分享主题'}
);

分享图片

Linking.sendIntent('android.intent.action.SEND',{type: 'image/jpeg',uri: 'content://com.example.app/fileprovider/images/image.jpg',flags: 0x10000000 // FLAG_GRANT_READ_URI_PERMISSION}
);

启动特定应用

Linking.sendIntent('android.intent.action.MAIN',{packageName: 'com.tencent.mm', // 微信包名className: 'com.tencent.mm.ui.LauncherUI' // 微信主界面类名}
);

打开系统设置页面

// 打开 Wi-Fi 设置
Linking.sendIntent('android.settings.WIFI_SETTINGS');// 打开应用详情页
Linking.sendIntent('android.settings.APPLICATION_DETAILS_SETTINGS',{uri: 'package:com.example.myapp'}
);

像素比率 PixelRatio

获取当前设备的像素比率

const ratio = PixelRatio.get();

将逻辑像素转换为物理像素

const layoutSize = 100; // 逻辑像素
const physicalPixels = PixelRatio.getPixelSizeForLayoutSize(layoutSize);
console.log(`${layoutSize} 逻辑像素 = ${physicalPixels} 物理像素`);
// 在 Pixel Ratio 为 3 的设备上:100 → 300

将布局尺寸四舍五入为最接近的物理像素值,避免模糊

const layoutSize = 100.5; // 逻辑像素
const roundedSize = PixelRatio.roundToNearestPixel(layoutSize);
console.log(`四舍五入后的尺寸: ${roundedSize}`);
// 在 Pixel Ratio 为 3 的设备上:100.5 → 100.333(301 物理像素 / 3)

获取字体缩放比例

const fontScale = PixelRatio.getFontScale();
console.log('字体缩放比例:', fontScale);
// 默认为 1.0,用户增大字体时可能为 1.2、1.5 等

【实战】图片资源适配

import { Image, PixelRatio } from 'react-native';const getImageSource = () => {const ratio = PixelRatio.get();if (ratio >= 3) {return require('./image@3x.png'); // 高分辨率} else if (ratio >= 2) {return require('./image@2x.png'); // 中等分辨率} else {return require('./image@1x.png'); // 低分辨率}
};<Image source={getImageSource()} style={{ width: 100, height: 100 }} />

【实战】边框宽度处理

确保 1px 边框在所有设备上显示清晰

import { PixelRatio, StyleSheet } from 'react-native';const styles = StyleSheet.create({border: {borderWidth: 1 / PixelRatio.get(), // 物理像素为 1px},
});

【实战】精确布局计算

在需要高精度的场景中(如图表、游戏),确保布局计算准确

const WIDTH = 375; // 设计稿宽度
const scale = PixelRatio.getWindowDimensions().width / WIDTH;const normalize = (size) => {const newSize = size * scale;return PixelRatio.roundToNearestPixel(newSize);
};// 使用示例
const titleSize = normalize(24);
console.log('适配后的字体大小:', titleSize);

【Android 特有】自定义返回键的行为 BackHandler

返回键事件监听

// 定义处理函数
const handleBackPress = () => {// 处理逻辑return true;
};// 添加监听器
BackHandler.addEventListener('hardwareBackPress', handleBackPress);// 移除监听器
BackHandler.removeEventListener('hardwareBackPress', handleBackPress);

退出应用

BackHandler.exitApp(); // 退出应用
  • 【实战】阻止返回键直接退出应用
import React, { useEffect } from 'react';
import { BackHandler, Alert } from 'react-native';function App() {useEffect(() => {const backAction = () => {Alert.alert('确认退出', '确定要退出应用吗?', [{ text: '取消', onPress: () => null, style: 'cancel' },{ text: '确认', onPress: () => BackHandler.exitApp() },]);return true; // 阻止默认行为};const backHandler = BackHandler.addEventListener('hardwareBackPress',backAction);return () => backHandler.remove();}, []);return <YourAppContent />;
}
  • 【实战】双击返回键退出应用
import React, { useState, useEffect } from 'react';
import { BackHandler, ToastAndroid } from 'react-native';function App() {const [lastBackPressed, setLastBackPressed] = useState(0);useEffect(() => {const backAction = () => {const now = Date.now();const delta = now - lastBackPressed;if (delta < 2000) { // 2秒内连续点击BackHandler.exitApp(); // 退出应用return true;}setLastBackPressed(now);ToastAndroid.show('再按一次退出应用', ToastAndroid.SHORT);return true;};const backHandler = BackHandler.addEventListener('hardwareBackPress',backAction);return () => backHandler.remove();}, [lastBackPressed]);return <YourAppContent />;
}
  • 【实战】返回键导航回退
import React, { useEffect } from 'react';
import { BackHandler, NavigationContainer } from 'react-native';
import { createStackNavigator } from '@react-navigation/stack';const Stack = createStackNavigator();function App() {const navigation = useNavigation();useEffect(() => {const backAction = () => {if (navigation.canGoBack()) {navigation.goBack(); // 导航回退return true; // 已处理}return false; // 未处理,执行默认行为(退出应用)};const backHandler = BackHandler.addEventListener('hardwareBackPress',backAction);return () => backHandler.remove();}, [navigation]);return (<NavigationContainer><Stack.Navigator>{/* 路由配置 */}</Stack.Navigator></NavigationContainer>);
}

推荐第三方库的 useBackHandler

npm install @react-native-community/hooks
import { useBackHandler }from '@react-native-community/hooks'
  useBackHandler(() => {// 按返回键,即退出应用return true;});

【Android 特有】权限 PermissionsAndroid

权限值

PermissionsAndroid.PERMISSIONS.CAMERA          // 相机
PermissionsAndroid.PERMISSIONS.RECORD_AUDIO   // 麦克风
PermissionsAndroid.PERMISSIONS.READ_CONTACTS  // 读取联系人
PermissionsAndroid.PERMISSIONS.WRITE_CONTACTS // 修改联系人
PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION // 精确定位
PermissionsAndroid.PERMISSIONS.ACCESS_COARSE_LOCATION // 模糊定位
PermissionsAndroid.PERMISSIONS.READ_EXTERNAL_STORAGE // 读取外部存储
PermissionsAndroid.PERMISSIONS.WRITE_EXTERNAL_STORAGE // 写入外部存储
PermissionsAndroid.PERMISSIONS.SEND_SMS       // 发送短信
PermissionsAndroid.PERMISSIONS.READ_SMS       // 读取短信

权限结果

PermissionsAndroid.RESULTS.GRANTED    // 已授予
PermissionsAndroid.RESULTS.DENIED     // 已拒绝
PermissionsAndroid.RESULTS.NEVER_ASK_AGAIN // 已拒绝且选中"不再询问"

如果要申请某个权限,还必须在 AndroidManifest.xml 中声明该权限

<uses-permission android:name="android.permission.CAMERA" />

检查权限状态 PermissionsAndroid.check

import { PermissionsAndroid } from 'react-native';async function checkCameraPermission() {const granted = await PermissionsAndroid.check(PermissionsAndroid.PERMISSIONS.CAMERA);if (granted) {console.log('已获得相机权限');} else {console.log('未获得相机权限');}
}

请求单个权限 PermissionsAndroid.request

async function requestCameraPermission() {try {const granted = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.CAMERA,{title: '相机权限请求',message: '需要相机权限以使用扫码功能',buttonPositive: '同意',buttonNegative: '拒绝',buttonNeutral: '稍后询问' // Android 6.0+ 可用});if (granted === PermissionsAndroid.RESULTS.GRANTED) {console.log('用户授予相机权限');} else {console.log('用户拒绝相机权限');}} catch (err) {console.warn('权限请求错误:', err);}
}

请求多个权限 PermissionsAndroid.requestMultiple

async function requestLocationAndContacts() {const permissions = [PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,PermissionsAndroid.PERMISSIONS.READ_CONTACTS];const results = await PermissionsAndroid.requestMultiple(permissions);if (results['android.permission.ACCESS_FINE_LOCATION'] === PermissionsAndroid.RESULTS.GRANTED &&results['android.permission.READ_CONTACTS'] === PermissionsAndroid.RESULTS.GRANTED) {console.log('用户授予所有请求的权限');} else {console.log('用户拒绝了部分权限');}
}

【实战】请求相机权限

import React, { useState, useEffect } from 'react';
import {Button,View,Text,PermissionsAndroid,ToastAndroid
} from 'react-native';function CameraPermissionExample() {const [hasCameraPermission, setHasCameraPermission] = useState(false);useEffect(() => {checkCameraPermission();}, []);// 检查权限const checkCameraPermission = async () => {const status = await PermissionsAndroid.check(PermissionsAndroid.PERMISSIONS.CAMERA);setHasCameraPermission(status);};// 请求权限const requestCameraPermission = async () => {try {const result = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.CAMERA,{title: '相机权限',message: '需要相机权限以拍照上传',buttonPositive: '同意',buttonNegative: '拒绝'});if (result === PermissionsAndroid.RESULTS.GRANTED) {ToastAndroid.show('相机权限已获取', ToastAndroid.SHORT);setHasCameraPermission(true);} else if (result === PermissionsAndroid.RESULTS.NEVER_ASK_AGAIN) {ToastAndroid.show('请在设置中手动开启相机权限', ToastAndroid.LONG);} else {ToastAndroid.show('相机权限被拒绝', ToastAndroid.SHORT);}} catch (err) {console.error('权限请求错误:', err);}};return (<View style={{ padding: 20 }}><Text>相机权限状态: {hasCameraPermission ? '已授权' : '未授权'}</Text><Buttontitle={hasCameraPermission ? '打开相机' : '请求权限'}onPress={hasCameraPermission ? openCamera : requestCameraPermission}/></View>);
}// 打开相机的函数实现
const openCamera = () => {// 实现相机功能console.log('打开相机');
};

【实战】引导用户到设置页面手动授权

当用户拒绝权限并选择 “不再询问” 时,需要引导用户到设置页面手动授权:

import { Linking } from 'react-native';// ...const handlePermissionDenied = () => {Alert.alert('权限被拒','需要相机权限才能使用此功能,请在设置中授予权限',[{ text: '取消', style: 'cancel' },{text: '去设置',onPress: () => Linking.openSettings()}]);
};

振动 Vibration

Android 中

需要在 AndroidManifest.xml 中声明振动权限

<uses-permission android:name="android.permission.VIBRATE" />
// 振动 400 毫秒(默认持续时间)
Vibration.vibrate();
// 自定义持续时间(500 毫秒)
Vibration.vibrate(500);
// 停止振动
Vibration.cancel();

自定义振动模式

// 模式:等待 100ms → 振动 200ms → 等待 300ms → 振动 400ms
const pattern = [100, 200, 300, 400];// 振动一次,不循环
Vibration.vibrate(pattern, false);
// 循环振动(第二个参数为 true)
Vibration.vibrate(pattern, true);

IOS 中

  • 无需配置,直接使用
  • 每次振动,固定 400 ms ,无法自定义
  • 自定义模式有差异
// 模式:等待 100ms → 振动 400ms → 等待 200ms → 振动 400ms ……
const pattern = [100, 200, 300, 400];

键盘 Keyboard

useEffect(() => {// 监听键盘显示事件const keyboardDidShowListener = Keyboard.addListener('keyboardDidShow',(e) => {ToastAndroid.show(`键盘高度: ${e.endCoordinates.height}`, ToastAndroid.SHORT);});// 监听键盘隐藏事件const keyboardDidHideListener = Keyboard.addListener('keyboardDidHide',() => {ToastAndroid.show('键盘已隐藏', ToastAndroid.SHORT);});// 组件卸载时移除监听return () => {keyboardDidShowListener.remove();keyboardDidHideListener.remove();};}, []);
// 关闭键盘Keyboard.dismiss();

【实战】点击空白区域关闭键盘

import React from 'react';
import { View, TextInput, TouchableWithoutFeedback, Keyboard } from 'react-native';const DismissKeyboardExample = () => {const dismissKeyboard = () => {Keyboard.dismiss();};return (<TouchableWithoutFeedback onPress={dismissKeyboard} accessible={false}><View style={{ flex: 1, padding: 16 }}><TextInputstyle={{ height: 40, borderColor: 'gray', borderWidth: 1, marginBottom: 16 }}placeholder="输入文本..."/><Text>点击空白区域关闭键盘</Text></View></TouchableWithoutFeedback>);
};

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

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

相关文章

Selenium自动化测试常见的异常处理

在软件开发和测试领域,Selenium作为一种广泛使用的自动化测试工具,扮演着至关重要的角色。随着自动化测试的不断普及,如何在测试过程中有效捕获并处理异常,成为了每个测试工程师必须掌握的技能。本文旨在深入探讨Selenium异常处理的方法,通过丰富的案例和代码,帮助新手朋…

企业级安全实践:SSL 加密与权限管理(二)

权限管理&#xff1a;企业数据的守护者 权限管理的基本概念与重要性 权限管理&#xff0c;是指根据系统设置的安全规则或策略&#xff0c;用户可以访问且仅能访问自己被授权的资源&#xff0c;不多不少 。它是企业信息安全体系的重要组成部分&#xff0c;旨在确保只有授权的人…

AMAT P5000 CVDFDT CVDMAINT Precision 5000 Mark 操作 电气原理 PCB图 电路图等

AMAT P5000 CVDFDT CVDMAINT Precision 5000 Mark 操作 电气原理 PCB图 电路图等

深入浅出:语言模型中的“自回归生成”是什么?

在当今大语言模型&#xff08;LLM&#xff09;如 ChatGPT、GPT-4、文心一言、通义千问等风靡的时代&#xff0c;“自回归生成”是驱动它们流畅对话、创作文本的核心引擎。 理解它是深入掌握LLM工作原理的关键一步。本文将用清晰易懂的语言&#xff0c;结合实例&#xff0c;为你…

LLMs基础学习(八)强化学习专题(5)

LLMs基础学习&#xff08;八&#xff09;强化学习专题&#xff08;5&#xff09; 文章目录 LLMs基础学习&#xff08;八&#xff09;强化学习专题&#xff08;5&#xff09;重要性采样&#xff08;Importance Sampling&#xff09;权重计算逻辑两种实现形式使用注意事项 PPO 与…

深入理解“回调地狱“(Callback Hell)

"回调地狱"是异步编程中常见的问题&#xff0c;指由于过多嵌套的回调函数导致的代码难以理解和维护的情况。 一、什么是回调地狱 基本概念 回调地狱(Callback Hell/Pyramid of Doom)是指&#xff1a; 多层嵌套的回调函数形成的代码结构 代码向右缩进越来越深&…

Oracle 的 TCP.SEND_TIMEOUT 参数

Oracle 的 TCP.SEND_TIMEOUT 参数 一 参数基本概念 TCP.SEND_TIMEOUT 是 Oracle Net Services 中的一个重要参数&#xff0c;用于控制 TCP 数据发送操作的最长等待时间。 二 关键特性 特性说明参数类型sqlnet.ora 配置文件参数默认值none (无超时限制)单位ms, sec, min, 默…

[Nginx] 配置中的sendfile参数详解:从传统 IO 到零拷贝的性能优化

一、sendfile 是什么&#xff1f; sendfile 是 Nginx 中一个关键的配置参数&#xff0c;用于控制是否使用操作系统提供的 sendfile() 系统调用来传输文件。 sendfile on;&#xff1a;启用零拷贝技术&#xff0c;直接由内核将文件发送到网络。sendfile off;&#xff1a;使用传统…

(LeetCode 每日一题) 2138. 将字符串拆分为若干长度为 k 的组 (字符串、模拟)

题目&#xff1a;2138. 将字符串拆分为若干长度为 k 的组 思路&#xff1a;字符串模拟&#xff0c;时间复杂度0(n)。 C版本&#xff1a; class Solution { public:vector<string> divideString(string s, int k, char fill) {vector<string> v;int ns.size();for…

C++法则1:在 C++ 中,所有的具名变量都是左值,即使它们的类型是右值引用。

看下面例子&#xff1a; test(0)调用的是函数是&#xff1a; template<typename T> void test(T&& t) {std::cout << "右值引用" << std::endl; }test(n)调用的是函数是&#xff1a; template<typename T> void test(T& t) {st…

python如何使用正则提取文章所有形容词

在Python中使用正则表达式提取文章中的形容词需要结合语言特性处理。以下是分步解决方案&#xff1a; 英文场景解决方案&#xff08;推荐使用专业NLP库&#xff09;&#xff1a; import re import nltk nltk.download(averaged_perceptron_tagger) # 首次使用需要下载text …

低代码平台的数据归集及治理

低代码平台或无码平台&#xff0c;在建表单的时候&#xff0c;都是每一个表单一个json的格式文件&#xff0c;存储在Nosql数据库中。在开发的过程中&#xff0c;有以下主要的需求 1、json格式实时的转为关系数据库的格式&#xff0c;存入到关系数据库中 需要在流程结束的时候&…

Origin:如何使柱状图看起来悬空

想得到这样的一个没有下轴的柱状图&#xff0c;操作步骤如下: 1.点击下轴坐标轴 2.修改效果

Vite 原理深入剖析

1. 整体架构设计 Vite 的整体架构由几个关键模块组成,每个模块都对应具体的源码文件: 开发服务器:用于处理浏览器请求、模块解析和热更新。开发服务器的代码主要位于 src/node/server/index.ts。 模块解析与热更新:通过模块中间件拦截请求,处理代码转换与热模块替换。相关…

微处理器原理与应用篇---常见基础知识(5)

一、什么是嵌入式系统 嵌入式系统是一种以应用为中心、以计算机技术为基础、软硬件可裁剪的专用计算机系统&#xff0c;通常嵌入在其他设备中&#xff0c;用于实现特定功能。它广泛存在于消费电子、工业控制、汽车电子、医疗设备等领域&#xff0c;是现代智能设备的核心 “大脑…

Redis 8.0向量库 vs 传统向量数据库:大模型知识库开发选型全指南

在大模型知识库开发领域&#xff0c;向量数据库的选择直接影响系统的性能、扩展性和开发效率。随着Redis 8.0推出Vector Set数据结构并增强向量搜索能力&#xff0c;开发者面临新的选择困境&#xff1a;是采用传统专用向量数据库&#xff08;如Milvus、Pinecone&#xff09;&am…

偏向锁撤销为什么会触发STW?

偏向锁撤销触发STW&#xff08;Stop-The-World&#xff09;的根本原因在于其撤销操作需要​​全局内存一致性​​和​​线程状态确定性​​&#xff0c;具体机制如下&#xff1a; ⚙️ ​​一、偏向锁撤销的核心流程​​ ​​竞争触发撤销​​ 当线程B尝试获取已被线程A偏向的…

Java观察者模式详解

观察者模式(Observer Pattern)是一种行为型设计模式&#xff0c;它定义了对象之间的一对多依赖关系&#xff0c;当一个对象(主题)的状态发生改变时&#xff0c;所有依赖于它的对象(观察者)都会自动收到通知并更新。 核心概念 观察者模式包含以下核心角色&#xff1a; ‌Subje…

创世新布控球 国标

目录 结论&#xff1a; UDP模式 对讲 平台页面设置 设备tcp被动 旧的创世版本&#xff08;平台选的设备tcp被动&#xff1b;设备侧无法设置&#xff09; 新创世从2.8改到180上&#xff0c;先UDP&#xff0c;全报文 参考文档 结论&#xff1a; 对讲的tcp主被动&#xff0…

【Dify精讲】第18章:企业级功能定制

在企业级AI应用的实际部署中&#xff0c;你很快就会发现开源版本的标准功能往往无法满足复杂的业务需求。作为一个在多家企业实施AI系统的老兵&#xff0c;我深知企业级定制的痛点和需求。今天&#xff0c;让我们一起深入Dify的企业级功能定制&#xff0c;看看如何在现有架构基…