首页 文章 精选 留言 我的

精选列表

搜索[ JDK 25],共10000篇文章
优秀的个人博客,低调大师

Android应用程序键盘(Keyboard)消息处理机制分析(25)

Step 2. ActivityStack.activityIdleInternal 这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中: publicclassActivityStack{ ...... finalvoidactivityIdleInternal(IBindertoken,booleanfromTimeout, Configurationconfig){ ...... ArrayList<ActivityRecord>stops=null; ...... intNS=0; ...... synchronized(mService){ ...... //Atomicallyretrievealloftheotherthingstodo. stops=processStoppingActivitiesLocked(true); NS=stops!=null?stops.size():0; ...... } inti; ...... //Stopanyactivitiesthatarescheduledtodosobuthavebeen //waitingforthenextonetostart. for(i=0;i<NS;i++){ ActivityRecordr=(ActivityRecord)stops.get(i); synchronized(mService){ if(r.finishing){ finishCurrentActivityLocked(r,FINISH_IMMEDIATELY); }else{ ...... } } } ...... } ...... } 这个函数首先会调用processStoppingActivitiesLocked函数把所有处于Stopped状态的Activity取回来,然后逐个分析它们,如果它们的ActivityRecord中的finishing成员变量为true,就说明这个Activity需要销毁了,于是,就调用finishCurrentActivityLocked函数来销毁它们。 Step 3.ActivityStack.finishCurrentActivityLocked 这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中: publicclassActivityStack{ ...... privatefinalActivityRecordfinishCurrentActivityLocked(ActivityRecordr, intmode){ ...... returnfinishCurrentActivityLocked(r,index,mode); } privatefinalActivityRecordfinishCurrentActivityLocked(ActivityRecordr, intindex,intmode){ ...... //makesuretherecordiscleanedoutofotherplaces. mStoppingActivities.remove(r); mWaitingVisibleActivities.remove(r); ...... finalActivityStateprevState=r.state; r.state=ActivityState.FINISHING; if(mode==FINISH_IMMEDIATELY ||prevState==ActivityState.STOPPED ||prevState==ActivityState.INITIALIZING){ //Ifthisactivityisalreadystopped,wecanjustfinish //itrightnow. returndestroyActivityLocked(r,true)?null:r; }else{ ...... } returnr; } ...... } 从上面的Step 2中传进来的参数mode为FINISH_IMMEDIATELY,并且这个即将要被销毁的Activity的状态为Stopped,因此,接下来就会调用destroyActivityLocked函数来销毁它。 Step 4.ActivityStack.destroyActivityLocked 这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中: publicclassActivityStack{ ...... finalbooleandestroyActivityLocked(ActivityRecordr, booleanremoveFromApp){ ...... booleanremovedFromHistory=false; ...... finalbooleanhadApp=r.app!=null; if(hadApp){ ...... try{ ...... r.app.thread.scheduleDestroyActivity(r,r.finishing, r.configChangeFlags); }catch(Exceptione){ ...... } ...... }else{ ...... } ...... returnremovedFromHistory; } ...... } 在前面一篇文章Android应用程序启动过程源代码分析中,我们说到,每一个应用程序进程在ActivityManagerService中,都ProcessRecord记录与之对应,而每一个Activity,都是运行在一个进程上下文中,因此,在ActivityManagerService中,每一个ActivityRecord的app成员变量都应该指向一个ProcessRecord记录,于是,这里得到的hadApp为true。在ProcessRecord类中,有一个成员变量thread,它的类型为IApplicationThread。在文章Android应用程序启动过程源代码分析中,我们也曾经说过,每一个应用程序在启动的时候,它都会在内部创建一个ActivityThread对象,而在这个ActivityThread对象中,有一个成员变量mAppThread,它的类型为ApplicationThread,这是一个Binder对象,专门用来负责在应用程序和ActivityManagerService之间执行进程间通信工作的。应用程序在启动的时候,就会将这个Binder对象传递给ActivityManagerService,而ActivityManagerService就会把它保存在相应的ProcessRecord记录的thread成员变量中。因此,ProcessRecord记录的thread成员变量其实就是ApplicationThread对象的远程接口,于是,执行下面这个语句的时候: r.app.thread.scheduleDestroyActivity(r,r.finishing, r.configChangeFlags); 就会进入到ApplicationThread类中的scheduleDestroyActivity函数来。 Step 5.ApplicationThread.scheduleDestroyActivity 这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中: publicfinalclassActivityThread{ ...... privatefinalclassApplicationThreadextendsApplicationThreadNative{ ...... publicfinalvoidscheduleDestroyActivity(IBindertoken,booleanfinishing, intconfigChanges){ queueOrSendMessage(H.DESTROY_ACTIVITY,token,finishing?1:0, configChanges); } ...... } ...... } 这个函数调用外部类ActivityThread的queueOrSendMessage函数来往应用程序的消息队列中发送一个H.DESTROY_ACTIVITY消息,这个消息最终由ActivityThread类的handleDestroyActivity函数来处理。 本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966656,如需转载请自行联系原作者

优秀的个人博客,低调大师

OpenStack 通用设计思路 - 每天5分钟玩转 OpenStack(25)

API 前端服务 每个 OpenStack 组件可能包含若干子服务,其中必定有一个 API 服务负责接收客户请求。 以 Nova 为例,nova-api 作为 Nova 组件对外的唯一窗口,向客户暴露 Nova 能够提供的功能。 当客户需要执行虚机相关的操作,能且只能向 nova-api 发送 REST 请求。 这里的客户包括终端用户、命令行和 OpenStack 其他组件。 设计 API 前端服务的好处在于: 1. 对外提供统一接口,隐藏实现细节 2. API 提供 REST 标准调用服务,便于与第三方系统集成 3. 可以通过运行多个 API 服务实例轻松实现 API 的高可用,比如运行多个 nova-api 进程 Scheduler 调度服务 对于某项操作,如果有多个实体都能够完成任务,那么通常会有一个 scheduler 负责从这些实体中挑选出一个最合适的来执行操作。 在前面的例子中,Nova 有多个计算节点。 当需要创建虚机时,nova-scheduler 会根据计算节点当时的资源使用情况选择一个最合适的计算节点来运行虚机。 调度服务就好比是一个开发团队中的项目经理,当接到新的开发任务时,项目经理会评估任务的难度,考察团队成员目前的工作负荷和技能水平,然后将任务分配给最合适的开发人员。 除了 Nova,块服务组件 Cinder 也有 scheduler 子服务,后面我们会详细讨论。 Worker 工作服务 调度服务只管分配任务,真正执行任务的是 Worker 工作服务。 在 Nova 中,这个 Worker 就是 nova-compute 了。 将 Scheduler 和 Worker 从职能上进行划分使得 OpenStack 非常容易扩展: 当计算资源不够了无法创建虚机时,可以增加计算节点(增加 Worker) 当客户的请求量太大调度不过来时,可以增加 Scheduler Driver 框架 OpenStack 作为开放的 Infrastracture as a Service 云操作系统,支持业界各种优秀的技术。 这些技术可能是开源免费的,也可能是商业收费的。 这种开放的架构使得 OpenStack 能够在技术上保持先进性,具有很强的竞争力,同时又不会造成厂商锁定(Lock-in)。 那 OpenStack 的这种开放性体现在哪里呢? 一个重要的方面就是采用基于 Driver 的框架。 以 Nova 为例,OpenStack 的计算节点支持多种 Hypervisor。 包括 KVM, Hyper-V, VMWare, Xen, Docker, LXC 等。 Nova-compute 为这些 Hypervisor 定义了统一的接口,hypervisor 只需要实现这些接口,就可以 driver 的形式即插即用到 OpenStack 中。 下面是 nova driver 的架构示意图 在 nova-compute 的配置文件 /etc/nova/nova.conf 中由 compute_driver 配置项指定该计算节点使用哪种 Hypervisor 的 driver 在我们的环境中因为是 KVM,所以配置的是 Libvirt 的 driver。 不知大家是否还记得我们在学习 Glance 时谈到: OpenStack 支持多种 backend 来存放 image。 可以是本地文件系统,Cinder,Ceph,Swift 等。 其实这也是一个 driver 架构。 只要符合 Glance 定义的规范,新的存储方式可以很方便的加入到 backend 支持列表中。 再后面 Cinder 和 Neutron 中我们还会看到 driver 框架的应用。 Messaging 服务 在前面创建虚机的流程示意图中,我们看到 nova-* 子服务之间的调用严重依赖 Messaging。 Messaging 是 nova-* 子服务交互的中枢。 以前没接触过分布式系统的同学可能会不太理解为什么不让 API 直接调用Scheduler,或是让Scheuler 直接调用 Compute,而是非要通过 Messaging 进行中转。 这里做一些解释。 程序之间的调用通常分两种:同步调用和异步调用。 同步调用 API 直接调用 Scheduler 的接口就是同步调用。 其特点是 API 发出请求后需要一直等待,直到 Scheduler 完成对 Compute 的调度,将结果返回给 API 后 API 才能够继续做后面的工作。 异步调用 API 通过 Messaging 间接调用 Scheduler 就是异步调用。 其特点是 API 发出请求后不需要等待,直接返回,继续做后面的工作。 Scheduler 从 Messaging 接收到请求后执行调度操作,完成后将结果也通过 Messaging 发送给 API。 在 OpenStack 这类分布式系统中,通常采用异步调用的方式,其好处是: 解耦各子服务 子服务不需要知道其他服务在哪里运行,只需要发送消息给 Messaging 就能完成调用。 提高性能 异步调用使得调用者无需等待结果返回。这样可以继续执行更多的工作,提高系统总的吞吐量。 提高伸缩性 子服务可以根据需要进行扩展,启动更多的实例处理更多的请求,在提高可用性的同时也提高了整个系统的伸缩性。而且这种变化不会影响到其他子服务,也就是说变化对别人是透明的。 在后面各章节,我们都能看到 Messaging 的应用。 Database OpenStack 各组件都需要维护自己的状态信息。 比如 Nova 中有虚机的规格、状态,这些信息都是在数据库中维护的。 每个 OpenStack 组件在 MySQL 中有自己的数据库。 小结 Nova 是 OpenStack 中最重要的组件,也是很典型的组件。 Nova 充分体现了 OpenStack 的设计思路。 理解了这种思路,再来学习 OpenStack 的其他组件就能够举一反三,清晰容易很多。 我们在后面 Cinder 和 Neutron 的学习中还会回顾这些设计思路。

优秀的个人博客,低调大师

wu-easy-excel-starter 版本:1.2.0-JDK1.8-SNAPSHOT

1.新增注解 EasyFile 注解支持字符串导出为文件 2.新增EasyExcel 注解支持对象导出文件 介绍 wu-easy-excel-starter是一款面向对象的excel、文件导出框架。 实现的功能: 1)针对Java中任何对象直接返回给web,在返回web过程自动将对象转换成想要的数据(Excel、File) 2)前端传一个Excel过来,后端接口接收到的其实已经是Bean了 快速导出excel模块 依赖引入 <dependency> <groupId>com.wu</groupId> <artifactId>wu-easy-excel-starter</artifactId> <version>1.0.1-SNAPSHOT</version> </dependency> 基本用法 @Data public class UseExcel { @EasyExcelFiled(name = "id") private Integer id; @EasyExcelFiled(name = "当前时间") private LocalDateTime currentTime; @EasyExcelFiled(name = "描述") private String desc; @EasyExcelFiled(name = "类型") private String type; } @EasyExcel(fileName = "导出数据") @GetMapping("/run/{size}") public List<UseExcel> run(@PathVariable Integer size) { List<UseExcel> useExcelList = new ArrayList<>(); for (int i = 0; i < size; i++) { UseExcel useExcel = new UseExcel(); useExcel.setCurrentTime(LocalDateTime.MAX); useExcel.setDesc("默认方式导出数据"); useExcel.setId(i); useExcel.setType("默认方式双注解导出"); useExcelList.add(useExcel); } return useExcelList; } 自定义字段注解用法 @Data public class UseExcel { @JSONField(name = "id") private Integer id; @JSONField(name = "当前时间") private LocalDateTime currentTime; @JSONField(name = "描述") private String desc; @JSONField(name = "类型") private String type; } @EasyExcel(fileName = "非原生注解导出数据", filedColumnAnnotation = JSONField.class,filedColumnAnnotationAttribute = "name",multipleSheet = true, limit = 10,sheetShowContext = EasyExcel.SheetShowContext.TEXT) @GetMapping("/run2/{size}") public List<UseExcel> run2(@PathVariable Integer size) { List<UseExcel> useExcelList = new ArrayList<>(); for (int i = 0; i < size; i++) { UseExcel useExcel = new UseExcel(); useExcel.setCurrentTime(LocalDateTime.MAX); useExcel.setDesc("自定义字段注解方式导出数据"); useExcel.setId(i); useExcel.setType("自定义字段注解导出"); useExcelList.add(useExcel); } return useExcelList; } 说明 filedColumnAnnotation 从 JSONField注解的name属性中获取表头并导出数据 multipleSheet 导出的数据分多个sheet(工作簿) limit每个sheet 有10条数据 sheetShowContext每个sheet的名称使用EasyExcel.SheetShowContext.TEXT 中文 自定义字段注解+自定控制器注解用法 @Data public class UseExcel { @JSONField(name = "id") private Integer id; @JSONField(name = "当前时间") private LocalDateTime currentTime; @JSONField(name = "描述") private String desc; @JSONField(name = "类型") private String type; } 自定意义EasyExcel注解 @Target({ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @EasyExcel(useAnnotation = false,filedColumnAnnotation = JSONField.class) public @interface EasyExcelTemp { /** * 文件名称 * @return String */ @AliasFor(annotation = EasyExcel.class,attribute = "fileName") String fileName(); } 使用方法 @EasyExcelTemp(fileName = "自定义注解导出") @GetMapping("/run4/{size}") public List<UseExcel> run4(@PathVariable Integer size) { List<UseExcel> useExcelList = new ArrayList<>(); for (int i = 0; i < size; i++) { UseExcel useExcel = new UseExcel(); useExcel.setCurrentTime(LocalDateTime.MAX); useExcel.setDesc("自定义注解导出"); useExcel.setId(i); useExcel.setType("自定义注解导出"); useExcelList.add(useExcel); } return useExcelList; } 新增垂直合并excel

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册