当前位置: 首页 > 科技观察

鸿蒙OS《鸿蒙操作系统开发入门经典》-线程管理-剪贴板

时间:2023-03-20 01:07:05 科技观察

更多内容请访问:鸿蒙科技社区https://harmonyos.51cto.com本文于2021年07月24日08:28:18发布本文包含作者在徐文利老师的《鸿蒙操作系统开发入门经典》学习过程中的笔记总结、延伸思考、案例反馈、阅读心得。为了尊重老师的知识产权和简化本文,本文不会贴代码、反例、机械打字。3.7线程管理3.7.1线程管理时间:2021-07-2408:50:383注:本书这部分与开发文档基本一致(来自开发文档)1.不同应用在各自独立进程中的概述运行中。当应用程序以任何形式启动时,系统都会为其创建一个进程,该进程将继续运行。当进程完成当前任务处于等待状态,系统资源不足时,系统自动回收。当应用程序启动时,系统会为该应用程序创建一个称为“主线程”的执行线程。该线程随应用程序一起创建或消失,是应用程序的核心线程。UI界面的显示、更新等操作都在主线程上进行。主线程也称为UI线程。默认情况下,所有操作都在主线程上执行。如果需要执行耗时的任务(如下载文件、查询数据库),可以创建其他线程进行处理。2.场景介绍如果应用的业务逻辑比较复杂,可能需要创建多个线程来执行多个任务。在这种情况下,代码复杂且难以维护,任务和线程之间的交互也会更加复杂。为了解决这个问题,开发者可以使用=="TaskDispatcher"==来分发不同的任务。3.接口说明TaskDispatcher是一个任务分发器,是Ability分发任务的基本接口,隐藏了任务所在线程的实现细节。为了确保应用程序更好的响应能力,我们需要对设计任务进行优先级排序。在UI线程上运行的任务默认以高优先级运行。TaskDispatcher有多个实现,每个实现对应不同的任务调度器。分配任务时可以指定任务的优先级,同一个任务分配器分配的任务具有相同的优先级。系统提供的任务调度器包括GlobalTask??Dispatcher、ParallelTask??Dispatcher、SerialTask??Dispatcher、SpecTaskDispatcher。为了更好的体现四种任务派发器之间的比较关系,作者做了下表:注:UITaskDispatcher和MainTaskDispatcher属于专有任务派发器SpecTastDispatcher。推荐使用UITaskDispatcher。//GlobalTask??Dispatcher全局并发任务分发器TaskDispatcherglobalTask??Dispatcher=getGlobalTask??Dispatcher(TaskPriority.DEFAULT);//ParallelTask??Dispatcher并发任务分发器StringdispatcherName="parallelTask??Dispatcher";TaskDispatcherparallelTask??Dispatcher=createParallelTask??Dispatcher(dispatcherName,TaskPriority.DEFAULT);//SerialTask??Dispatcher串行任务分发器StringdispatcherName="serialTask??Dispatcher";TaskDispatcherserialTask??Dispatcher=createSerialTask??Dispatcher(dispatcherName,TaskPriority.DEFAULT);//SpecTaskDispatcher专有任务调度器TaskDispatcheruiTaskDispatcher=getUITaskDispatcher();开发步骤总结为了更好的体现开发任务之间的对比关系,作者列表如下:3.7.2线程间通信时间:2021-07-2410:32:10注:书中的这一段正是与开发文档相同。学习总结:目的:合理使用线程资源元素:事件(InnerEvent)、任务(Runnable)、机制(EventHandler)、循环器(EventRunner)场景:投递事件(双向)、投递任务、方法:均分创建机制子类编写方法CreatecirculatorCreatemechanismsubclassinstanceDeliveryevent(需要获取事件实例),deliverytaskstartorstopmechanism1.概述在开发过程中,开发者经常需要在当前线程处理下载任务等耗时操作,但不希望当前线程被阻塞。此时,就可以使用EventHandler机制了。EventHandler是HarmonyOS用来处理线程间通信的一种机制。通过EventRunner可以创建一个新线程,在新线程上执行耗时操作。这样就不会阻塞原来的线程,可以合理的处理任务。2.基本概念EventRunner是一个事件循环器,从EventRunner创建的新线程的事件队列中循环处理InnerEvent事件或Runnable任务。InnerEvent是EventHandler传递的事件。EventHandler是用户将当前线程上的InnerEvent事件或Runnable任务发布到异步线程进行处理的一种机制。每个EventHandler都绑定了一个由指定的EventRunner创建的新线程,新线程内部有一个事件队列。EventHandler可以将指定的InnerEvent事件或Runnable任务传递给这个事件队列。EventRunner周期性地从事件队列中获取事件。如果获取到的事件是InnerEvent事件,则在EventRunner所在线程执行processEvent回调;如果获取的事件是一个Runnable任务,Runnable的run回调会在EventRunner所在线程执行。一般来说,Eve??ntHandler有两个主要功能:在不同线程之间分发和处理InnerEvent事件或Runnable任务延迟处理InnerEvent事件或Runnable任务。三、运行机制使用EventHandler实现线程间通信的主要过程:1、EventHandler将具体的InnerEvent事件或Runnable任务传递到EventRunner创建的线程的事件队列中。2.EventRunner循环从事件队列中获取InnerEvent事件或Runnable任务。3、处理事件或任务:如果EventRunner获取到的事件是InnerEvent事件,则触发EventHandler的回调方法并触发EventHandler的处理方法,在新的线程上处理该事件。如果EventRunner获取到的事件是一个Runnable任务,EventRunner会直接在新的线程上处理这个Runnable任务。4.Constraint限制在进行线程间通信时,EventHandler只能绑定到EventRunner创建的线程上。创建EventRunner时,需要判断是否创建成功。只有获取到的EventRunner实例不为空,才能与EventHandlerEventRunner进行绑定。一个EventHandler只能同时绑定一个EventRunner,一个EventRunner可以同时绑定多个EventHandler。5.EventRunner的工作模式EventRunner的工作模式分为托管模式和手动模式。这两种模式是通过在调用EventRunner的create()方法时选择不同的参数来实现的,详见API参考。托管模式是默认模式。托管模式:开发者无需调用run()和stop()方法来启动和停止EventRunner。EventRunner实例化时,系统调用run()启动EventRunner;当未引用EventRunner时,系统调用stop()停止EventRunner。手动模式:开发者需要调用EventRunner的run()方法和stop()方法来保证线程的启停。6、EventRunner和EventHandler的接口很多。7.三个开发应用EventHandler传递InnerEvent事件EventHandler传递Runnable任务在新创建的线程中传递事件给原线程3.6.17系统剪贴板服务时间:2021年7月24日08:28:14系统剪贴板服务:应用中复制的数据A可以粘贴到应用B中。HarmonyOS提供了系统剪贴板服务的操作接口。HarmonyOS提供剪贴板数据的定义。注意:只有在前台获得焦点的应用程序才可以读取系统剪贴板,写入数据的权限不会随应用程序结束而销毁。数据将被覆盖。同一设备的剪贴板不应超过800KB。接口说明:SystePastedboard提供了系统剪贴板操作(复制、粘贴、配置回调)的相关接口PageData是剪贴板服务操作的数据对象。PageData由多个内容节点(PageData.Record)和一个属性集合对象(PageData.DataProperty)组成。记录是存储剪贴板数据信息的最小单位。每个记录都有特定的MIME类型(文本、HTML、URL、意图)。剪贴板数据的属性存储在DataProperty(时间戳、标签)中。开发步骤:获取服务A,写入输入数据B.读取数据C.添加数据变化回调小结在线程管理中,有四种任务调度器,三种调度任务,三种基本操作,两种障碍。这部分问题是不可避免的。线程通信需要对目的、场景、元素、方法进行整体把握。剪贴板的原理我还没有仔细研究过。感觉很简单。今天了解到,确实很简单,但是在开发过程中有一些需要注意的地方。更多信息请访问:Harmonyos.51cto.com,与华为官方合作打造的鸿蒙技术社区