当前位置: 首页 > news >正文

Android Fragment:详解,结合真实开发场景Navigation

目录

1)Fragment是什么
2)Fragment的应用场景
3)为什么使用Fragment?
4)Fragment如何使用
5)Fragment的生命周期
6)Android开发,建议是多个activity,还是activity结合fragment,优缺点如何?
7)Fragment和Activity的通讯、返回键如何处理
8)Navigation搭配Fragment使用后,事务是怎么样?

一、Fragment是什么


Fragment是Android中的一种组件,直译为“碎片”或“片段”,可以看作是Activity的模块化部分。

它主要用于承载一部分用户界面和逻辑,并可以在多个Activity中复用。Fragment具有自己的生命周期,能接收输入事件,可以在Activity运行时被添加、移除、替换或隐藏。此外,Fragment还允许开发者通过FragmentManager来管理其生命周期和事务,如添加、删除、替换Fragment等。

二、Fragment的应用场景


导航

  1. UI一:
    在这里插入图片描述
  2. UI二:
    在这里插入图片描述

三、为什么使用Fragment?


  1. 通过将复杂的界面拆分成多个Fragment,每个Fragment负责一部分UI和逻辑,可以提高代码的复用性和可维护性。不同的Fragment可以专注于处理特定的UI或逻辑,使得代码更加清晰和易于管理。
  2. Fragment可以被多个Activity复用,提高了代码的复用率。在模块化开发中,一个Fragment可以代表一个独立的业务模块,从而在不同的地方重复使用。

四、Fragment如何使用


4.1 Fragment一般搭配navigation进行使用


(1)创建一个导航条+容器:也就是我们上面案例种的左边部分(导航条)和内容显示部分(容器)

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"><com.google.android.material.navigation.NavigationViewandroid:id="@+id/bnv_main_navigationbar"android:layout_width="300dp"android:layout_height="match_parent"android:background="@color/white"android:paddingHorizontal="9dp"app:itemBackground="@color/white"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:menu="@menu/backstage_menu_setting" /><androidx.fragment.app.FragmentContainerViewandroid:id="@+id/home_fragmentcontainerview"android:name="androidx.navigation.fragment.NavHostFragment"android:layout_width="0dp"android:layout_height="0dp"android:background="@drawable/dingdian_pic_background_sys"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="1.0"app:layout_constraintStart_toEndOf="@+id/bnv_main_navigationbar"app:layout_constraintTop_toBottomOf="@+id/backstage_constraintlayout"app:navGraph="@navigation/backstage_nav" /></androidx.constraintlayout.widget.ConstraintLayout>

(2)那么导航条view和容器view我们已经创建出来,那么导航条的这些:“首页”,“内容"这些item如何来呢?没错,可以看到上面我们使用了 app:menu=”@menu/backstage_menu_setting" ,我们需要创建meun对象出来。
在这里插入图片描述
在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><itemandroid:id="@+id/backstage_cottoncandyfragment"android:title="首页"/><itemandroid:id="@+id/backstage_paramsetfragment"android:title="内容"/><itemandroid:id="@+id/backstage_datastatfragment"android:title="咨讯"/><itemandroid:id="@+id/backstage_languagefragment"android:title="产品"/><itemandroid:id="@+id/backstage_errorstatfragment"android:title="图库"/><itemandroid:id="@+id/backstage_resetpwdfragment"android:title="消息"/><itemandroid:id="@+id/backstage_localalarmclockfragment"android:title="广告"/><itemandroid:id="@+id/backstage_permissionfragment"android:title="设置"/>
</menu>

(3)下面我们就需要创建fragment了,Fragment就是右边部分的容器内容。

@AndroidEntryPoint
class PriceFragment : BaseFragment<BackstageFragmentPriceBinding, ErrorStatFragmentVM>() {override val mViewModel: ErrorStatFragmentVM by viewModels()override fun createVB() = BackstageFragmentPriceBinding.inflate(layoutInflater)override fun BackstageFragmentPriceBinding.initView() {}override fun initObserve() {}override fun initRequestData() {mViewModel.getBanners()mViewModel.getArticleData()}}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/backstage_textview"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Datastat"android:textSize="40dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

(4)那么如何设置点击这些“首页”,"资讯"就能打开对应的Fragment呢?使用Navigation,让我们可以使用非常简短的代码就能实现跳转。首先我们要创建一个导航文件
在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/backstage_nav"app:startDestination="@id/backstage_datastatfragment"><fragmentandroid:id="@+id/backstage_cottoncandyfragment"android:name="com.quyunshuo.wanandroid.home.ui.fragment.CottonCandyFragment"android:label="CottonCandyFragment" /><fragmentandroid:id="@+id/backstage_paramsetfragment"android:name="com.quyunshuo.wanandroid.home.ui.fragment.ParamSetFragment"android:label="ParamSetFragment" /><fragmentandroid:id="@+id/backstage_datastatfragment"android:name="com.quyunshuo.wanandroid.home.ui.fragment.DataStatFragment"android:label="DataStatFragment" /><fragmentandroid:id="@+id/backstage_errorstatfragment"android:name="com.quyunshuo.wanandroid.home.ui.fragment.ErrorStatFragment"android:label="ErrorStatFragment" /><fragmentandroid:id="@+id/backstage_languagefragment"android:name="com.quyunshuo.wanandroid.home.ui.fragment.LanguageFragment"android:label="LanguageFragment" /><fragmentandroid:id="@+id/backstage_resetpwdfragment"android:name="com.quyunshuo.wanandroid.home.ui.fragment.ResetPwdFragment"android:label="ResetPwdFragment" /><fragmentandroid:id="@+id/backstage_localalarmclockfragment"android:name="com.quyunshuo.wanandroid.home.ui.fragment.LocalAlarmClockFragment"android:label="LocalAlarmClockFragment" /><fragmentandroid:id="@+id/backstage_permissionfragment"android:name="com.quyunshuo.wanandroid.home.ui.fragment.PermissionFragment"android:label="PermissionFragment" /><fragmentandroid:id="@+id/backstage_otherfragment"android:name="com.quyunshuo.wanandroid.home.ui.fragment.OtherFragment"android:label="OtherFragment" />
</navigation>

注意,android:id="@+id/backstage_otherfragment"的id必须和menu的item id必须相同,这样才能找到对应的fragment
(5)实现使用navcontroller实现跳转

  bnvMainNavigationbar.setNavigationItemSelectedListener{val findNavController = findNavController(homeFragmentcontainerview.id)findNavController.navigate(it.itemId)true}

五、Fragment的生命周期


想要了解Fragment的生命周期,离不开Activity的生命周期,所以我们会一起讲到。

Fragment的生命周期由FragmentManager管理,FragmentManager负责将Fragment添加到Activity中,并在Fragment不再需要时将其移除。在Fragment的生命周期中,有几个关键点需要注意:

1)当Fragment被添加到Activity中时,会依次调用onAttach()、onCreate()、onCreateView()、onActivityCreated()、onStart()和onResume()方法。

2)当Fragment对用户不可见时(如被另一个Activity覆盖),会依次调用onPause()、onStop()方法。

3)当Fragment被移除或宿主Activity被销毁时,会依次调用onPause()、onStop()、onDestroyView()、onDestroy()和onDetach()方法。注意,如果只是Fragment被切换了,不会调用onDestroy()方法,只是调用onDestroyView,不要以为他离开了界面就是销毁了

在这里插入图片描述

5.1 Fragment的生命周期通过一系列回调方法来管理,这些方法在Fragment状态变化时被调用。以下是Fragment的主要生命周期回调方法:


1)onAttach(Context context):当Fragment与Activity关联时调用。这是Fragment生命周期中的第一个回调方法,此时可以获取到宿主Activity的引用。

2)onCreate(Bundle savedInstanceState):当Fragment被创建时调用。用于初始化Fragment的基本数据,如加载布局文件等。

3)onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState):创建Fragment的视图层次结构。如果Fragment没有UI,可以返回null。

4)onViewCreated(View view, Bundle savedInstanceState):当Fragment的视图被创建时调用。此时可以对视图进行进一步的初始化操作。

5)onActivityCreated(Bundle savedInstanceState):当宿主Activity的onCreate()方法完成后调用。此时Fragment的视图层次结构已完全创建,可以安全地与Activity的视图进行交互。

6)onStart():Fragment对用户可见时调用。此时Fragment开始对用户可见,但可能还未完全交互。

7)onResume():Fragment开始与用户交互时调用。此时Fragment完全可见且可交互。

8)onPause():Fragment失去焦点或停止与用户交互时调用。此时应保存一些重要数据或停止一些操作,如动画、网络请求等。

9)onStop():Fragment完全不可见时调用。此时应释放一些资源或做一些清理工作。

10)onDestroyView():Fragment的视图被销毁时调用。此时应释放与视图相关的资源。

11)onDestroy():Fragment被销毁时调用。此时应释放Fragment的成员变量和数据,以便回收内存和资源。

12)onDetach():Fragment与Activity分离时调用。此时应做一些最终的清理工作。

onDestroy和onDestroyView方法的区别

一、onDestroyView():
1)当Fragment的视图层次结构(即UI)被销毁时调用。这通常发生在Fragment不再需要显示其UI时,可能是因为用户离开了包含该Fragment的Activity,或者因为Fragment被替换或移除了。
2)在onDestroyView()被调用后,Fragment仍然存在于内存中,并且其状态(如成员变量等)仍然保持。但是,与视图相关的资源应该被释放,以避免内存泄漏。

二、onDestroy():
1)当Fragment被销毁时调用。这是Fragment生命周期中的最后一个回调方法,表示Fragment即将被系统回收,其资源将被完全释放。
2)在onDestroy()被调用后,Fragment无法再接收到任何生命周期回调,并且其资源(如内存)将被系统回收。


onDestroyView()主要负责释放与视图相关的资源,而onDestroy()则负责清理Fragment占用的所有资源。

六、Android开发,建议是多个activity,还是activity结合fragment,原因是什么


主要取决于你的应用需求、设计目标以及用户体验的考虑。下面是一些关于这两种方式的优缺点以及选择建议:
1. 使用多个Activity

优点:

清晰的逻辑分离:每个Activity可以专注于一个特定的任务或用户流程,使得代码更加模块化和易于管理。
任务栈管理:Android系统通过任务栈管理Activity,可以很方便地实现页面之间的跳转和返回,尤其是在处理复杂的用户流程时。
内存管理:当Activity不再需要时,系统可以更容易地回收其占用的资源。

缺点:

    界面切换动画:Activity之间的切换可能会比Fragment之间的切换更重,因为涉及到整个界面的重建。数据共享:Activity之间的数据共享可能需要通过Intent、全局变量或数据库等方式,相对复杂。用户体验:在某些情况下,过多的Activity跳转可能会导致用户感到困惑,尤其是在需要频繁切换界面时。

2.使用Activity结合Fragment

优点:

 灵活的界面布局:Fragment可以在一个Activity中重用,并且可以在运行时动态地添加、移除或替换,非常适合实现复杂的用户界面布局。更好的用户体验:Fragment之间的切换通常比Activity之间的切换更流畅,因为不需要重建整个界面。数据共享:Fragment与宿主Activity之间的数据共享更加直接和方便,可以通过接口回调等方式实现。缺点:
```kt复杂性增加:Fragment的生命周期比Activity更复杂,需要更仔细地管理,以避免内存泄漏等问题。状态管理:Fragment的状态管理可能更加复杂,尤其是在处理多个Fragment的嵌套和动态变化时。

选择建议

    如果你的应用界面相对简单,且每个界面之间的逻辑相对独立,可以考虑使用多个Activity。如果你的应用需要实现复杂的用户界面布局,或者需要在同一个Activity中动态地展示不同的内容区域,那么使用Activity结合Fragment可能是一个更好的选择。考虑用户体验和内存管理。Fragment之间的切换通常更流畅,但也需要更仔细地管理其生命周期和状态。考虑应用的维护性和可扩展性。使用Fragment可以使代码更加模块化和可重用,但也可能增加复杂性。

七、返回键如何处理

在activity中,我们导航了很多的Fragment,比如从A Framgent到了B Fragment,再到了C Fragment,如果我想点击物理的返回按键,如何返回到到一个Fragment呢?并且,如果到了最初的A Framgnet,想提示如果再次点击将退出app这种的提示应该如何写呢?

 override fun onBackPressed() {val navController =findNavController(mBinding.homeFragmentcontainerview.id)val fragmentPopped = navController.popBackStack()Log.d("fragmentPopped", "onBackPressed: "+fragmentPopped)// 如果popBackStack()返回false,意味着没有Fragment可以返回了// 这里你可以假设已经回到了最开始的Fragment,或者根本就没有Fragment在栈中if (!fragmentPopped) {// 没有任何Fragment可以返回了,结束Activity// 获取当前时间戳val currentTime = System.currentTimeMillis()// 判断与上一次点击返回键的时间间隔是否小于1秒if (currentTime - backPressedTime < 1000) {super.onBackPressed() // 执行默认的返回键操作(退出Activity)} else {Toast.makeText(this, "再次点击返回键退出", Toast.LENGTH_SHORT).show()backPressedTime = currentTime // 更新上一次点击返回键的时间戳}}}

navController.popBackStack()会移除栈顶的Fragment,如果存在fragment,就会返回true,否则返回false。

7.1 假如说,我想从A Fragment跳到B Fragment的时候,我想A Fragment直接就销毁了呢?

  <fragmentandroid:id="@+id/home_homefragment"android:name="com.quyunshuo.wanandroid.home.ui.fragment.HomeFragment"android:label="HomeFragment" ><actionandroid:id="@+id/home_action_home_homefragment_to_home_makefragment"app:destination="@id/home_makefragment"app:popUpTo="@id/home_homefragment"app:popUpToInclusive="true"/><fragment/>

app:popUpTo=“@id/home_homefragment”
app:popUpToInclusive=“true”
的意思就是跳转的时候,将之前的Fragment销毁掉。就保留自己作为栈顶

八、Navigation搭配Fragment使用后,事务是怎么样?

当使用Navigation组件来管理Fragment的创建和切换时,Fragment的事务(Transaction)是通过Navigation图(Navigation Graph)和NavController来隐式处理的。这种方式简化了Fragment的切换逻辑,让开发者可以更专注于Fragment之间的交互和业务逻辑的实现。

Fragment事务的隐式处理

1)在传统的Fragment管理中,你可能需要显式地调用FragmentManager的beginTransaction()、add()、replace()等方法来创建Fragment事务。但在使用Navigation组件时,这些操作都被封装在Navigation图内,并由NavController根据导航操作(如点击按钮、接收通知等)来自动处理。

2)例如,当你在Navigation图中定义了两个Fragment(A和B),并从一个Fragment(A)到另一个(B)的导航时,你只需要在A Fragment中调用NavController的navigate()方法,并传入目标Fragment的ID或Action ID。NavController会根据Navigation图自动处理Fragment的添加、替换和移除等事务。

https://blog.csdn.net/weixin_36049771/article/details/117580874?ops_request_misc=&request_id=&biz_id=102&utm_term=Fragment%E7%9A%84%E4%BB%BB%E5%8A%A1%E6%A0%88&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-3-117580874.142v100pc_search_result_base4&spm=1018.2226.3001.4187

相关文章:

Android Fragment:详解,结合真实开发场景Navigation

目录 1&#xff09;Fragment是什么 2&#xff09;Fragment的应用场景 3&#xff09;为什么使用Fragment? 4&#xff09;Fragment如何使用 5&#xff09;Fragment的生命周期 6&#xff09;Android开发&#xff0c;建议是多个activity&#xff0c;还是activity结合fragment&…...

JavaWeb中的Servlet

本笔记基于【尚硅谷全新JavaWeb教程&#xff0c;企业主流javaweb技术栈】https://www.bilibili.com/video/BV1UN411x7xe?vd_sourcea91dafe0f846ad7bd19625e392cf76d8总结 Servlet Servlet简介 动态资源和静态资源 静态资源 无需在程序运行时通过代码运行生成的资源,在程序运…...

SpringBoot AOP 简单的权限校验

本篇文章的主要内容是通过AOP切面编程实现简单的权限校验。 书接上回登录与注册功能 我们的用户表里面不是有role(权限)这个字段吗 在JWT令牌的生成中&#xff0c;我们加入了role字段。 那么接下来&#xff0c;我们就可以通过这个字段来实现权限校验。 我这里就很简单&#x…...

Java生成Word->PDF->图片:基于poi-tl 进行word模板渲染

文章目录 引言I Java生成Word、PDF、图片文档获取标签渲染数据生成文档案例II 工具类封装2.1 word 渲染和word 转 pfd2.2 pdf转成一张图片III poi-tl(word模板渲染) 标签简介文本标签{{var}}图片标签表格标签引用标签IV poi-tl提供了类 Configure 来配置常用的设置标签类型前后…...

JVM内存模型笔记

1. 运行时数据区概述 JVM内存布局规定了Java运行过程中的内存申请、分配和管理策略。运行时数据区分为线程私有和线程共享两种。 2. 线程私有内存 程序计数器&#xff1a;存储当前线程执行的字节码指令地址。虚拟机栈&#xff1a;保存方法调用的局部变量和部分结果。本地方法…...

每日一练 - eSight 网管远程告警通知方式

01 真题题目 eSight 网管支持的远程告警通知方式包括:(多选) A.邮件 B.语音 C.短信 D.微信 02 真题答案 AC 03 答案解析 eSight 网管系统支持多种远程告警通知方式&#xff0c;包括邮件和短信。 这些通知方式可以帮助网络管理员及时了解网络设备的状态和告警信息&#xff0…...

[matlab] 鲸鱼优化算法优化KNN分类器的特征选择

目录 引言 智能优化算法概述 智能优化算法在KNN特征选择中的应用 应用步骤 UCI数据集 鲸鱼优化算法 一、算法背景与原理 二、算法组成与步骤 三、算法特点与优势 四、应用与挑战 代码实现 鲸鱼优化算法 主程序 打印结果 引言 智能优化算法在优化KNN&#xff08;…...

vscode ssh-remote 疑似内存泄漏问题

vscode ssh-remote疑似内存泄漏问题 系统信息与版本号 版本&#xff1a;1.88.1&#xff08;通用&#xff09; 日期&#xff1a;2024-04-10T17:42:52.765Z Electron: 28.2.8 ElectronBuildId: 27744544 Chromium&#xff1a;120.0.6099.291 Node.js&#xff1a;18.18.2 V8&…...

初识自然语言处理NLP

文章目录 1、简介2、自然语言处理的发展简史3、语言学理论句法学&#xff08;Syntax&#xff09;语义学&#xff08;Semantics&#xff09;语用学&#xff08;Pragmatics&#xff09;形态学&#xff08;Morphology&#xff09; 4、统计与机器学习方法n-gram 模型隐马尔可夫模型…...

分布式系统架构-微服务架构

一.什么是分布式系统架构 分布式系统架构是指将一个单一的应用程序或服务拆分成多个独立的部分&#xff0c;这些部分可以在不同的计算机、服务器或者地理位置上运行&#xff0c;并通过网络进行通信和协作。分布式系统的设计旨在提高系统的可靠性、可用性和扩展性&#xff0c;同…...

docker搭建内网穿透服务

docker搭建内网穿透服务 frpfrpsfrpc zerotier构建 moon构建 planet查询客户端配置moon方法 nps frp 参考文章&#xff1a;https://blog.csdn.net/weixin_43909881/article/details/126526059 frps docker pull snowdreamtech/frps docker run --restartalways --network ho…...

html+css+js网页设计 体育 金轮健身7个页面

htmlcssjs网页设计 体育 金轮健身7个页面 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&…...

BGP基础简介(一)

AS 是一组运行相同IGP协议的设备组成的网络 AS号&#xff1a; 16bit&#xff1a;64512~65535为私有AS32bit:4200000000~4294967294为私有AS其余都是共有AS&#xff0c;需要向IANA申请 EGP 外部网关协议&#xff0c;bgp的前身&#xff0c;缺点:只发布路由信息&#xff0c;不…...

力扣面试150 反转链表 II 三指针

Problem: 92. 反转链表 II &#x1f468;‍&#x1f3eb; 参考题解 特殊情况 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val…...

GPT-4.o mini

https://share.xuzhugpt.cloud/ GPT-4.o mini 目前免费使用 把上面[chatgpt4o-mini-xuzhu]复制到UserToken的文本框中 点击[个人账户] 测试一下哈&#xff0c;看看&#xff1a; GPT-4.o代码有时候还是有严重错误&#xff1a;好奇怎么来的 上面是我写得&#xff0c;下面是GPT写…...

【C++】优先级队列(容器适配器)

欢迎来到我的Blog&#xff0c;点击关注哦&#x1f495; 前言 string vector list 这种线性结构是最基础的存储结构&#xff0c;C&#xff08;STL&#xff09;container很好的帮助我们数据存储的问题。 容器适配器 介绍 容器适配器是C标准模板库&#xff08;STL&#xff09;中…...

docker代理

Dockerd 代理 sudo mkdir -p /etc/systemd/system/docker.service.d sudo touch /etc/systemd/system/docker.service.d/proxy.confproxy.conf [Service] Environment"HTTP_PROXYproxy.example.com:8080/" Environment"HTTPS_PROXYproxy.example.com:8080/&qu…...

(四)activit5.23.0修复跟踪高亮显示BUG

一、先看bug 在 &#xff08;三&#xff09;springboot2.7.6集成activit5.23.0之流程跟踪高亮显示 末尾就发现高亮显示与预期不一样&#xff0c;比如上面的任务2前面的箭头没有高亮显示。 二、分析原因 具体分析步骤省略了&#xff0c;主要是ProcessInstanceHighlightsResour…...

AsyncTask

AsyncTask简介 AsyncTask 是 Android 提供的一个轻量级的异步任务类&#xff0c;它允许在后台线程中执行耗时操作&#xff08;如网络请求、数据库操作等&#xff09;&#xff0c;并在操作完成后更新 UI。其设计初衷是为了简化后台任务的处理&#xff0c;特别是在不需要复杂并发…...

嵌入式面试知识点总结 -- FreeRTOS篇

一、堆栈溢出检测 问题&#xff1a; 问题一&#xff1a;FreeRTOS堆栈溢出检测的方法&#xff1f; 解答&#xff1a; 参看&#xff1a;FreeRTOS学习 – FreeRTOSConfig.h介绍 两种堆栈溢出检测方法&#xff1a; 方法1: 开启方法&#xff0c;configCHECK_FOR_STACK_OVERFLOW…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...