HarmonyOS开发案例:【UIAbility内和UIAbility间页面的跳转】

news2024/10/6 22:26:40

UIAbility内和UIAbility间页面的跳转(ArkTS)

介绍

基于Stage模型下的UIAbility开发,实现UIAbility内和UIAbility间页面的跳转。包含如下功能:

  1. UIAbility内页面的跳转。
  2. 跳转到指定UIAbility的首页。
  3. 跳转到指定UIAbility的指定页面(非首页)。

最终效果图如下:

相关概念

  • [UIAbility组件概述]:UIAbility组件是一种包含UI界面的应用组件,主要用于和用户交互。UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口。一个应用可以包含一个或多个UIAbility组件。
  • [UIAbilityContext]:UIAbilityContext是[UIAbility]的上下文环境,继承自[Context],提供UIAbility的相关配置信息以及操作UIAbility和ServiceExtensionAbility的方法。
  • [页面路由]:提供通过不同的url访问不同的页面,包括跳转到应用内的指定页面、用应用内的某个页面替换当前页面、返回上一页面或指定的页面等。
  • [Text]:文本组件,用于呈现一段文本信息。
  • [Button]:按钮组件,可快速创建不同样式的按钮。

环境搭建

软件要求

  • [DevEco Studio]版本:DevEco Studio 3.1 Release。
  • OpenHarmony SDK版本:API version 9。

硬件要求

  • 开发板类型:[润和RK3568开发板]。
  • OpenHarmony系统:3.2 Release。

环境搭建

完成本篇Codelab我们首先要完成开发环境的搭建,本示例以RK3568开发板为例,参照以下步骤进行:

  1. [获取OpenHarmony系统版本]:标准系统解决方案(二进制)。以3.2 Release版本为例:

  2. 搭建烧录环境。

    1. [完成DevEco Device Tool的安装]
    2. [完成RK3568开发板的烧录]
  3. 搭建开发环境。

    1. 开始前请参考[工具准备],完成DevEco Studio的安装和开发环境配置。
    2. 开发环境配置完成后,请参考[使用工程向导]创建工程(模板选择“Empty Ability”)。
    3. 工程创建完成后,选择使用[真机进行调测]。
    4. 开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。

代码结构解读

本篇Codelab只对核心代码进行讲解,完整代码可以直接从gitee获取。

├──device/src/main/ets              // device模块的代码区
│  ├──pages
│  │  ├──Index.ets                  // SecondAbility的Index页面
│  │  └──Second.ets                 // SecondAbility的Second页面
│  ├──secondability
│  │  └──SecondAbility.ets          // 程序入口类
├──device/src/main/resources        // device模块的资源文件目录
├──entry/src/main/ets               // entry模块的代码区
│  ├──common
│  │  ├──constants
│  │  │  ├──CommonConstants.ets     // 公共常量类
│  │  │  └──StyleConstants.ets	    // 样式常量类
│  │  ├──utils
│  │  │  ├──GlobalContext.ets       // 全局变量控制类
│  │  │  └──Logger.ets	            // 日志打印类
│  ├──entryability
│  │  └──EntryAbility.ts            // 程序入口类
│  ├──model
│  │  └──ButtonClickMethod.ets      // 按钮点击后调用的方法类
│  ├──pages
│  │  ├──Index.ets                  // EntryAbility的Index页面
│  │  └──Second.ets                 // EntryAbility的Second页面
└──entry/src/main/resources         // entry模块的资源文件目录

`HarmonyOS与OpenHarmony鸿蒙文档籽料:mau123789是v直接拿`

搜狗高速浏览器截图20240326151450.png

UIAbility内页面的跳转

entry模块中,EntryAbility内页面的跳转可以通过页面路由router来实现。页面路由router根据页面url找到目标页面,从而实现跳转。效果图如下:

  1. 实现UIAbility内页面的跳转,我们首先需要构建两个页面。在“Project”窗口,点击“entry > src > main > ets > pages”,打开“Index.ets”文件,可以看到EntryAbility的Index页面由一个Image组件、两个Text组件、三个Button组件组成。“Index.ets”文件的示例代码如下:

    @Entry
    @Component
    struct Index {
      @State text: string = '';
      @State bottomMargin: string = StyleConstants.MAIN_INDEX_BUTTON_MARGIN_BOTTOM;
    
      build() {
        Column() {
          Image($r('app.media.right'))
            ...
    
          Text($r('app.string.main_index_page_name'))
            ...
    
          // 条件渲染:当text的值不为空时,显示该组件
          if (this.text !== '') {
            Text(this.text)
              ...
          }
    
          // 导航到EntryAbility的Second Page
          Button($r('app.string.to_main_second_page_btn_text'), { type: ButtonType.Capsule, stateEffect: true })
            ...
    
          // 导航到SecondAbility的Index Page
          Button($r('app.string.to_second_index_page_btn_text'), { type: ButtonType.Capsule, stateEffect: true })
            ...
    
          // 导航到SecondAbility的Second Page
          Button($r('app.string.to_second_second_page_btn_text'), { type: ButtonType.Capsule, stateEffect: true })
            ...
        }
        ...
      }
    }
    
  2. 在“Project”窗口,打开“entry > src > main > ets”,右键点击“pages”文件夹,选择“New > Page”,命名为“Second”。可以看到EntryAbility的Second页面由一个Image组件、两个Text组件、一个Button组件组成。“Second.ets”文件的示例代码如下:

    @Entry
    @Component
    struct Second {
      ...
    
      build() {
        Column() {
          Image($r('app.media.left'))
            ...
    
          Text($r('app.string.main_second_page_name'))
            ...
    
          Text(`${this.src}:${this.count}`)
            ...
    
          // 返回到EntryAbility的Index Page
          Button($r('app.string.back_main_index_page_btn_text'), { type: ButtonType.Capsule, stateEffect: true })
            ...
        }
        ...
      }
    }
    
  3. 从entry模块的Index页面跳转到Second页面,并进行数据传递,通过页面路由router来实现。需要如下几个步骤:

    • 给两个页面导入router模块。
    • 在EntryAbility的Index页面中,点击“导航到EntryAbility的Second Page”按钮后,调用ButtonClickMethod类中的toEntryAbilitySecond方法,跳转到EntryAbility的Second页面。使用router.pushUrl实现跳转,可以通过params来向新页面传入参数,示例代码如下:
    // 导入router模块
    import router from '@ohos.router';
      
    // 导航到EntryAbility的Second Page
    toEntryAbilitySecond() {
      router.pushUrl({
        url: 'pages/Second',
        params: {
          src: textMessage,
          count: CommonConstants.NUM_VALUES[0]
        }
      });
    }
    
    • Second页面通过router.getParams()方法获取Index页面传递过来的自定义参数,并用一个Text文本展示从Index页面传递过来的数据,示例代码如下:
    @Entry
    @Component
    struct Second {
      ...
      // 获取Index页面传递过来的自定义参数
      params = router?.getParams();
      @State src: string = this.params == undefined ? '-' : (this.params as Record<string,Object>)['src'] as string;
      @State count: number = this.params == undefined ? 0 : (this.params as Record<string,Object>)['count'] as number;
      
      build() {
        Column() {
          Image($r('app.media.left'))
            ...
      
          Text($r('app.string.main_second_page_name'))
            ...
      
          // 用一个Text文本展示从Index页面传递过来的数据      
          Text(`${this.src}:${this.count}`)
            ...
      
          // 返回到EntryAbility的Index Page
          Button($r('app.string.back_main_index_page_btn_text'), { type: ButtonType.Capsule, stateEffect: true })
            ...
        }
        ...
      }
    }
    
  4. 从entry模块的Second返回到Index页面,使用router.back来实现。在EntryAbility的Second页面中,点击“返回到EntryAbility的Index Page”按钮后,返回到EntryAbility的Index页面,示例代码如下:

    // 返回到EntryAbility的Index Page
    router.back();
    

跳转到指定UIAbility的首页

实现UIAbility间页面的跳转,需要启动另外一个UIAbility,可以通过UIAbilityContext的startAbility的方法来完成。本篇Codelab是用两个模块(entry和device),实现UIAbility间页面的跳转。跳转到指定UIAbility的首页,效果图如下:

  1. 在本章节中,实现跳转到指定UIAbility的首页,我们需要新建一个模块。在“Project”窗口,右键点击“entry 文件夹”,选择“New > Module > Empty Ability > Next”,在“Module name”中给新建的模块命名为“device”,点击“Next”,在“Ability name”中给新建模块的Ability命名为“SecondAbility”,点击“Finish”。可以看到文件目录结构如下:

  2. 构建SecondAbility的首页。在“Project”窗口,点击“device > src > main > ets > pages”,打开“Index.ets”文件,可以看到SecondAbility的Index页面由一个Image组件、两个Text组件、一个Button组件组成。“Index.ets”文件的示例代码如下:

    @Entry
    @Component
    struct Index {
      ...
    
      build() {
        Column() {
          Image($r('app.media.left'))
            ...
    
          Text($r('app.string.second_index_page_name'))
            ...
    
          Text(`${this.src}:${this.count}`)
            ...
    
          // 停止SecondAbility自身
          Button($r('app.string.terminate_second_btn_text'), { type: ButtonType.Capsule, stateEffect: true })
            ...
        }
        ...
      }
    }
    
  3. 从entry模块的EntryAbility的首页,跳转到SecondAbility的首页,即从EntryAbility的Index页面跳转到SecondAbility的Index页面。通过UIAbilityContext的startAbility方法来实现。

    • 首先需要在EntryAbility的“Index.ets”文件中获取UIAbilityContext,示例代码如下:

      // 获取UIAbilityContext
      let context = getContext(this) as common.UIAbilityContext;
      

      说明: 如果需要使用UIAbilityContext中的方法,需要在对应的页面获取相应的UIAbilityContext。

    • 在EntryAbility的Index页面中,点击“导航到SecondAbility的Index Page”按钮后,调用ButtonClickMethod类中的toSecondAbilityIndex方法,拉起SecondAbility的Index页面。使用UIAbilityContext.startAbility来实现,可以通过parameters来向被拉起方传递参数,示例代码如下:

      // 导航到SecondAbility的Index Page
      toSecondAbilityIndex(context: common.UIAbilityContext) {
        let want: Want = {
          'deviceId': '',
          'bundleName': CommonConstants.BUNDLE_NAME,
          'abilityName': CommonConstants.SECOND_ABILITY_NAME,
          'moduleName': CommonConstants.DEVICE_MODULE_NAME,
          'parameters': {
             src: textMessage,
             count: CommonConstants.NUM_VALUES[1]
           }
        };
        context.startAbility(want).then(() => {
          Logger.info(CommonConstants.TAG, `start second ability index page succeed with ${JSON.stringify(want)}`);
        }).catch((error: Error) => {
          Logger.error(CommonConstants.TAG, `start second ability index page failedwith ${error}`);
        });
      }
      
    • 在SecondAbility的Index页面,获取从EntryAbility的Index页面传递过来的自定义参数,并用一个Text文本展示从Index页面传递过来的数据,示例代码如下:

      @Entry
      @Component
      struct Index {
        // 获取从EntryAbility的Index页面传递过来的自定义参数
        secondAbilityWant?: Want = GlobalContext.getContext().getObject('secondAbilityWant');
        @State src: string = this.secondAbilityWant?.parameters?.src as string ?? '-';
        @State count: number = this.secondAbilityWant?.parameters?.count as number ?? 0;
      
        build() {
          Column() {
            Image($r('app.media.left'))
              ...
      
            Text($r('app.string.second_index_page_name'))
              ...
      
            // 用一个Text文本展示从Index页面传递过来的数据
            Text(`${this.src}:${this.count}`)
              ...
      
            // 停止SecondAbility自身
            Button($r('app.string.terminate_second_btn_text'), { type: ButtonType.Capsule, stateEffect: true })
              ...
          }
          ...
        }
      }
      
  4. 在SecondAbility的Index页面,点击“停止SecondAbility自身”按钮,使用UIAbilityContext.terminateSelf方法手动销毁Ability。示例代码如下:

    // 停止SecondAbility自身
    terminateSecondAbility(context: common.UIAbilityContext) {
      context.terminateSelf().then(() => {
        Logger.info(CommonConstants.TAG, 'terminate second ability self succeed');
      }).catch((error: Error) => {
        Logger.error(CommonConstants.TAG, `terminate second ability self failed with ${error}`);
      });
    }
    
  5. 运行时,需要在DevEco Studio的entry模块中勾选“Deploy Multi Hap Packages”,如下图所示:

跳转到指定UIAbility的指定页面(非首页)

跳转到指定UIAbility的指定页面(非首页),本章节以从EntryAbility的Index页面跳转到SecondAbility的Second页面为例。只需要在本文档“跳转到指定UIAbility的首页”章节的基础上,另外在device模块中构建一个Second页面。效果图如下:

  1. 构建SecondAbility的Second页面。在“Project”窗口,打开“device > src > main > ets”,右键点击“pages”文件夹,选择“New > Page”,命名为“Second”。可以看到文件目录结构如下:

  2. 可以看到SecondAbility的Second页面由一个Image组件、两个Text组件、一个Button组件组成。“Second.ets”文件的示例代码如下:

    @Entry
    @Component
    struct Second {
      // 用来接收parameters参数传过来的值
      secondAbilityWant?: Want = GlobalContext.getContext().getObject('secondAbilityWant');
      @State src: string = this.secondAbilityWant?.parameters?.src as string ?? '-';
      @State count: number = this.secondAbilityWant?.parameters?.count as number ?? 0;
    
      build() {
        Column() {
          Image($r('app.media.left'))
            ...
    
          Text($r('app.string.second_second_page_name'))
            ...
    
          Text(`${this.src}:${this.count}`)
            ...
    
          // 停止SecondAbility自身并返回结果
          Button($r('app.string.terminate_second_for_result_btn_text'), { type: ButtonType.Capsule, stateEffect: true })
            ...
        }
        ...
      }
    }
    
  3. 在EntryAbility的Index页面中,点击“导航到SecondAbility的Second Page”按钮后,调用ButtonClickMethod类中的toSecondAbilitySecond方法,拉起SecondAbility的Second页面。

    • 使用UIAbilityContext.startAbilityForResult来实现,并获取被拉起侧销毁后的返回结果。可以通过parameters来向被拉起方传递参数,示例代码如下:

      // 导航到SecondAbility的Second Page
      toSecondAbilitySecond(context: common.UIAbilityContext, callback: (abilityResult: common.AbilityResult) => void) {
        let want: Want = {
          'deviceId': '',
          'bundleName': CommonConstants.BUNDLE_NAME,
          'abilityName': CommonConstants.SECOND_ABILITY_NAME,
          'moduleName': CommonConstants.DEVICE_MODULE_NAME,
          'parameters': {
             url: 'pages/Second',
             src: textMessage,
             count: CommonConstants.NUM_VALUES[2]
           }
        };
      
        // 被拉起侧销毁后,在startAbilityForResult回调中可以获取到被拉起侧销毁时传递过来的AbilityResult
        context.startAbilityForResult(want).then((result) => {
          callback(result);
          Logger.info(CommonConstants.TAG, `start second ability second page succeed with ${JSON.stringify(want)}`);
        }).catch((error: Error) => {
          Logger.error(CommonConstants.TAG, `start second ability second page failed with ${error}`);
        });
      }
      
    • 在“Project”窗口,点击“device > src > main > ets > SecondAbility”,打开“SecondAbility.ets”文件,在onWindowStageCreate的生命周期回调函数中获取拉起方的意图,展示SecondAbility的指定页面到界面。示例代码如下:

      onWindowStageCreate(windowStage: Window.WindowStage) {
        ...
        let parameters: Record<string, Object> = (GlobalContext.getContext().getObject('secondAbilityWant') as Want)?.parameters as Record<string, Object>;
        let url = parameters?.url ?
          parameters.url as string : 'pages/Index';
        windowStage.loadContent(url, (err, data) => {
          ...
        });
      }
      
  4. 在SecondAbility的Second页面,点击“停止SecondAbility自身并返回结果”按钮,使用UIAbilityContext.terminateSelfWithResult方法,传入不同的resultCode和want,手动销毁Ability。成功后发起拉起侧会收到abilityResult的值。示例代码如下:

    // 停止SecondAbility自身并返回结果
    terminateSecondAbilityForResult(context: common.UIAbilityContext) {
      let abilityResult: common.AbilityResult = {
        resultCode: CommonConstants.RESULT_CODE,
        want: {
          'deviceId': '',
          'bundleName': CommonConstants.BUNDLE_NAME,
          'abilityName': CommonConstants.SECOND_ABILITY_NAME,
          'moduleName': CommonConstants.DEVICE_MODULE_NAME,
          'parameters': {
             src: returnMessage,
             count: CommonConstants.RESULT_NUM_VALUE
           }
        }
      };
    
      // 停止SecondAbility自身,并将abilityResult返回给startAbilityForResult接口调用方
      context.terminateSelfWithResult(abilityResult).then(() => {
        Logger.info(CommonConstants.TAG, `terminate second ability self with
          result succeed with ${JSON.stringify(abilityResult)}`);
      }).catch((error: Error) => {
        Logger.error(CommonConstants.TAG, `terminate second ability self with
          result failed with ${error}`);
      });
    }
    

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AtCoder Regular Contest 177 D. Earthquakes(概率 单调栈)

题目 D - Earthquakes 思路来源 官方题解 题解 对于不存在连锁反应的区间&#xff0c;每个区间独立处理&#xff0c;最后求个乘积 对于每个区间&#xff0c;相邻的两个杆子距离都小于H&#xff0c; 意味着没倒的区间是个连续的区间&#xff0c;假设要算i的概率 一定是第i…

软考144-下午题-【试题三】:UML图-类图、用例图

一、分值与目标 题型&#xff1a; 问题一~问题三&#xff08;扩展/UML——>设计模式&#xff09; 二、UML基础知识回顾 2-1、关系 UML中有四种关系&#xff1a;依赖、关联、泛化、实现。 1、关联 关联是一种结构关系&#xff0c;它描述了一组链&#xff0c;链是对象之间的…

Uniapp 自定义弹窗

布局 <view><view v-if"show" class"popup"><view class"popup-box"><view>支付方式:{{way}}</view><view>停车费用:{{money}}</view><view class"btn-box"><view class"ca…

修改el-checkbox样式

一定要在最外层&#xff1b; //未选中框/deep/ .el-checkbox__inner{border-color: #0862a3;}//选中框/deep/ .el-checkbox__input.is-checked .el-checkbox__inner{background-color: #0862a3;border-color: #0862a3;}//未选中框时右侧文字/deep/ .el-checkbox__label{}//选中…

虚拟化技术 挂载iSCSI网络存储器

一、实验内容 挂载iSCSI网络存储器到ESXi主机 二、实验主要仪器设备及材料 安装有64位Windows操作系统的台式电脑或笔记本电脑&#xff0c;建议4C8G或以上配置已安装vSphere Client 三、实验步骤 1、挂载iSCSI网络存储器到ESXi主机 配置ESXi主机的虚拟网络 ESXi识别出三块…

【补充】图神经网络前传——DeepWalk

论文阅读 论文&#xff1a;https://arxiv.org/pdf/1403.6652 参考&#xff1a;【论文逐句精读】DeepWalk&#xff0c;随机游走实现图向量嵌入&#xff0c;自然语言处理与图的首次融合_随机游走图嵌入-CSDN博客 abstract DeepWalk是干什么的&#xff1a;在一个网络中学习顶点…

039——解决室内不能使用GPS问题

目录 引入 GUI整改 client添加GPS分析 完善服务器网络通讯部分代码 添加GPS的BSW层 GPS操作部分代码&#xff08;相当于驱动&#xff09; 效果展示 项目管理操作 引入 最近在写论文加上出去玩了一圈所以停更了一段时间。上次咱们GPS有个室内用不了的问题&#xff0c;咱…

Ubuntu 24 换国内源及原理 (阿里源 清华源 中科大源 网易源)

备份原文件 sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak 编辑源文件 sudo gedit /etc/apt/sources.list.d/ubuntu.sources 粘贴到文本&#xff08;其中一个即可&#xff09;&#xff1a; &#xff08;阿里源&#xff09…

与 Apollo 共创生态:Apollo 七周年大会带我体会自动驾驶技术的发展

前言 自动驾驶技术作为当今科技领域的热门话题&#xff0c;吸引着无数开发者和企业的目光。而在这个风起云涌的行业中&#xff0c;Apollo开放平台作为自动驾驶领域的领军者之一&#xff0c;扮演着不可或缺的角色。七年前&#xff0c;当Apollo开放平台刚刚起步时&#xff0c;也…

C语言(指针)5

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

等保一体机能过三级等保吗?过等保无需再买安全设备如何做到?

等保一体机能过三级等保吗&#xff1f;过等保无需再买安全设备如何做到&#xff1f; 全云在线 2024-03-28 12:08 广东 尽管等保建设的标准是统一的&#xff0c;但由于不同行业和用户规模的差异&#xff0c;建设方案呈现出多样化的特点。 虽然重点行业过等保现象确实已经十分…

【35分钟掌握金融风控策略25】定额策略实战2

目录 基于收入和负债的定额策略 确定托底额度和盖帽额度 确定基础额度 基于客户风险评级确定风险系数 计算最终授信额度 确定授信有效期 基于收入和负债的定额策略 在实际生产中&#xff0c;客户的收入和负债数据大多无法直接获得&#xff0c;对于个人的收入和负债数据&…

中小型客户过等保,选择比努力重要!

国内谈网络安全&#xff0c;等保是绕不过去的话题。 作为国家网络安全保障的基本制度、基本策略、基本方法&#xff0c;等保经过十几年发展&#xff0c;其基本概念、相关标准已经深入人心&#xff0c;市面上各类成熟的等保方案让用户应接不暇&#xff0c;挑花了眼。 网络安全…

数据结构之排序(上)

片头 嗨&#xff0c;小伙伴们&#xff0c;大家好&#xff01;我们今天来学习数据结构之排序&#xff08;上&#xff09;&#xff0c;今天我们先讲一讲3个排序&#xff0c;分别是直接插入排序、冒泡排序以及希尔排序。 1. 排序的概念及其应用 1.1 排序的概念 排序&#xff1a…

R语言数据分析案例-股票可视化分析

一、数据整合的对象 # Loading necessary libraries library(readxl) library(dplyr)# Reading the data from Excel files data_1 <- read_excel("云南白药.xlsx") data_2 <- read_excel("冰山.xlsx")二、数据整合的代码 # Reading the data from…

Docker:docker在项目中常用的一些命令

简介   Docker 是一个开源的容器化平台&#xff0c;它允许开发者将应用程序及其依赖项打包到一个可移植的容器中&#xff0c;并发布到任何安装了 Docker 引擎的机器上。这些容器是轻量级的&#xff0c;包含了应用程序运行所需的所有东西&#xff0c;如代码、系统库、系统工具…

“数字化叙事的革命:人工智能驱动的创意工具的崛起”

近年来&#xff0c;人工智能 (AI) 改变了我们生活的许多方面&#xff0c;数字故事讲述的世界也不例外。随着人工智能驱动的创意工具的出现&#xff0c;广告商、内容创作者和专业人士现在配备了创新的解决方案来简化他们的工作流程&#xff0c;增强他们的创意输出&#xff0c;并…

08.4.grafana自定义图形并直接数据库取值

grafana自定义图形并直接数据库取值 自定义添加油表图形 选择gauge图形&#xff0c;并且配置对应设定值&#xff0c;点击应用 如图所示&#xff0c;可以看到仪表盘上的值是zabbix上取得值 配置grafana直接数据库取值 添加mysql数据源 添加后进行配置&#xff0c;我这…

二分判定+选插冒排序+归并快速堆希尔+计数排序

二分力扣题 一&#xff1a;搜索二维矩阵 74. 搜索二维矩阵 按照题意&#xff1a;直接利用二维数组转换成一维数组进行求解 方法一&#xff1a;普通等于的二分查找 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {t…

websevere服务器从零搭建到上线(三)|IO多路复用小总结和服务器的基础框架

文章目录 epollselect和poll的优缺点epoll的原理以及优势epoll 好的网络服务器设计Reactor模型图解Reactor muduo库的Multiple Reactors模型 epoll select和poll的优缺点 1、单个进程能够监视的文件描述符的数量存在最大限制&#xff0c;通常是1024&#xff0c;当然可以更改数…