- 博客(90)
- 收藏
- 关注
原创 Redux-state学习笔记
Redux应用执行过程中的任何一个时刻本质上都是该时刻的应用state的反映。设计state时,最重要的是记住一句话:像设计数据库一样设计state。把state看作一个数据库,state中的每一部分状态看作数据库中的一张表,状态中的每一个字段对应表的一个字段。设计一个数据库应该遵循以下三个原则:数据按照领域分类存储在不同的表中,不同的表中存储的列数据不能重复;表中每一列的数据都依赖于这张表的主键;表中除了主键外,其他列之间不能有直接的依赖关系;对应的设计state需要遵循的原则:把整
2021-03-06 14:58:35
245
原创 React入门 Part10
简介React主要的关注点是如何创建可复用的视图层组件,对于组件间的数据传递和状态管理并没有给出很好的解决方案。基本概念Redux的主要思想就是描述应用的状态和根据action更新,Redux通过提供一系列的API将这一思想的落地实施进行标准化和规范化。三大原则唯一数据源Redux应用只维护一个全局的状态对象,存储在Redux的store中。唯一数据源是一种集中式管理应用状态的方式,便于监控任意时刻应用的状态和调试应用,减少出错的可能性。保持应用状态只读在任何时候都不能直接修改应用
2021-03-06 12:02:04
226
原创 React入门 Part9
React Router基本用法真实项目中,一般需要通过不同的URL标识不同的页面,也就是存在不同页面间路由的需求。单页面应用和前端路由在传统Web应用中,浏览器会根据地址栏的URL向服务器发送一个Http请求,服务器会根据URL返回一个HTML页面。这种情况下,一个URL对应一个HTML页面,一个Web应用包含很多HTML页面,这样的应用就是多页面应用;在多页面应用中,页面路由的控制由服务端负责,这中路由方式称为后端路由。在多页面应用中,每次页面切换都需要向服务器发送一次请求,页面使用的静态资源也
2021-03-05 17:43:00
249
原创 React入门 Part8
虚拟DOM虚拟DOM是和真实DOM相对应的,真实DOM也就是平常说的DOM。真实DOM是对结构化文本的抽象表达。在Web环境中,就是对HTML文本的一种抽象描述,每一个HTML元素对应一个DOM节点,HTML元素的层级关系也会体现在DOM节点的层级上,所有的这些DOM节点构成一棵DOM树。在传统的前端开发中,通过调用浏览器提供的一组API直接对DOM执行增删改查操作。对DOM进行增删改查操作,每一次对DOM的修改都会引起浏览器对页面的重新布局和重新渲染,这个过程是十分耗时的。前端性能优化的一条原则:
2021-03-01 14:38:51
123
原创 React入门 Part7
组件与服务器通讯组件向服务器提交数据一定是由组件UI的某一事件触发的,所以只要在监听相应事件的回调函数中执行向服务器提交数据的逻辑即可。组件挂载阶段通讯componentDidMount是执行服务器通讯的最佳地方,原因如下:componentDidMount中执行服务器通讯可以保证获取到数据时,组件已经处于挂载状态,这是即使要直接操作DOM也是安全的,而componentWillMount是无法保证的;当组件在服务器端渲染时,componentWillMount会被调用两次,一次是在服务器端,另
2021-02-27 18:10:17
113
原创 React入门 Part6
设计合适的State组件state必须能够代表一个组件UI呈现的完整状态集,即组件的任何UI改变都可以从state的变化中反映出来;同时,state还必须代表一个组件UI呈现的最小状态集,即state中的所有状态都用于反映组件UI的变化,没有任何多余的状态,也不应该存在通过其他状态计算而来的中间状态。state所代表的一个组件UI呈现的完整状态集又可以分为两类数据:用作渲染组件时用到的数据的来源;用于组件UI展现形式的判断依据;示例代码:import React from 'react';
2021-02-24 18:12:34
84
原创 React入门 Part5
Render方法返回类型render方法既可以返回一个元素,也可以返回一个数组或者字符串。返回数组示例代码:import React from 'react'class ListComponent extends React.Component { render() { return([ <li key="A">A</li>, <li key="B">B</li>,
2021-02-24 16:23:04
121
原创 React入门 Part4
列表和Keys在React中使用列表,应该为列表中的每一个元素添加一个名为key的属性(不添加也可以,但是会有提示建议添加)。当列表数据发生变化时,React就可以通过key知道哪些元素发生了变化,从而只重新加载发生变化的元素,以提高渲染效率。可以使用元素的索引(index)作为元素的key值,但是这样造成的问题是,如果元素发生了重排则会导致元素的索引发生变化,这样不利于React的渲染优化。示例代码:import React from 'react'import PostItem from '
2021-02-23 22:34:21
118
原创 React入门 Part3
组件生命周期在React中,通常一个组件的生命周期可以分为三个阶段:挂载阶段;更新阶段;卸载阶段;挂载阶段这个阶段组件被创建、执行初始化并被加载到DOM中,完成组件的第一渲染。依次调用到的生命周期函数有:constructor此方法是ES 6 class的构造方法,组件被创建时,会首先调用此方法。这个方法接受一个props参数,props参数是从父组件传入的属性对象,如果父组件中没有传入属性而组件自身又定义了默认属性,那么这个props属性指向的就是组件的默认属性。使用此方法时
2021-02-23 17:08:29
83
原创 React入门 Part2
组件组件是React的核心概念,是React应用程序的基石。组件将应用的UI拆分成独立的、可复用的模块,React应用程序正是由一个个组件搭建而成的。定义一个组件有两种方法:使用ES6 class (类组件)使用函数(函数组件)组件定义使用class定义组件使用class定义组件需要满足的两个条件:class继承自React.Component;class内部必须定义render方法,render方法返回代表该组件UI的React元素;在使用class定义类组件后,需要使用exp
2021-02-15 17:38:44
109
原创 React入门 Part1
JSXJSX是一种用于描述UI的JavaScript扩展语法,React使用这种语法描述组件的UI。JSX语法对使用React来说并不是必须的,实际上,JSX语法知识React.createElement(componet, props, …children)的语法糖,所有的JSX语法最终都会转换成这个方法的调用。JSX语法基本语法JSX基本语法和XML语法相同,都是使用成对的标签构成一个树状结构的数据。示例代码:import React from 'react';const TestEl
2021-02-15 10:54:42
145
1
原创 Google官方Demo-AppShortcuts学习
简介在Android 7.1 中引入了Launcher Shortcuts API。该API允许应用定义一组Intent,当用户长按应用启动器图标时,自定义的Intent就会显示。特点:每个快捷方式都引用一个Intent,每个Intent都会启动一个特定的动作或任务;可以通过将应用程序快捷方式添加到APK中的资源文件中,来为其添加静态快捷方式,也可以动态添加。静态快捷方式一般是常见的理想操作,动态快捷方式可以是用户的偏好,行为等要突出显示的操作;每个应用最多5个快捷键;源码
2020-09-16 16:19:03
430
原创 复习Android——MateriDesign
什么是MaterialDesigMaterialDesign是由Google基于传统的设计原则,设计出的一套全新的界面设计语言,包含了视觉、运动、互动效果等特性。ToolbarToolbar由AndroidX库提供。可以使用Theme.AppCompat.NoActionBar和Theme.AppCompat.Light.NoActionBar两种主题。使用Theme.AppCompat.Light.NoActionBar主题示例:<resources> <!-- B
2020-08-03 17:33:18
314
原创 复习Android——网络技术
WebView的用法使用WebView可以在不打开浏览器的情况下,在App中显示网页。借助WebView可以在自己的应用程序中嵌入一个浏览器。示例代码:获取网络访问权限:<!--获取网络访问权限--><uses-permission android:name="android.permission.INTERNET"/>如果没有申请权限,则会造成“网页无法访问”的问题。布局文件:<?xml version="1.0" encoding="utf-8"?>
2020-07-29 16:55:02
164
原创 复习Android——Service
Service简介Service是Android中实现程序后台运行的解决方案,Service非常适合执行不需要和用户交互而且还需要长期运行的任务。Service运行不依赖任何用户界面,即使程序被切换到后台,或者用户打开了另一个应用程序。Service并不是运行在一个独立的进程中,是依赖于创建Service的进程。当某个进程被杀死时,依赖于该进程的所有Service也就被杀死。Service并不会自动开启新的线程,所有的代码默认都是在主线程中运行。Android多线程编程线程的基本用法创建线程的
2020-07-22 17:59:40
207
原创 复习Android——多媒体
使用通知通知(notification),当某个应用程序希望向用户发出一些提示信息,而该应用又不在运行时,就可以借助通知来实现。发出通知后,手机最上方的状态栏中就会显示一个通知的图标,下拉状态栏后就可以看到通知的内容。创建通知渠道在Android8中引入通知渠道,每一条通知都属于一个对应的渠道。每个应用都可以自由地创建当前应用用于哪些通知渠道吗,但是这些通知渠道地控制权都是掌握在用户手上。对于每一个应用来说,渠道一旦创建之后就不能再修改了。创建通知渠道分为以下几步:首先需要一个Notif
2020-07-21 12:39:33
264
原创 复习Android——ContentProvider
简介ContentProvider主要用于在不同的应用之间实现数据共享,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时保证数据的安全性。ContentProvider是Android实现跨程序数据共享的标准方式。运行时权限Android权限机制权限申请即在Manifest文件中引入<uses-permission>元素:<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2020-07-18 20:46:20
256
原创 复习Android——持久化操作
持久化简介数据持久化就是指将内存中的数据保存到存储设备中,保证手机或者计算机关机的情况下数据不会丢失。文件存储使用文件存储的方式存储数据,不会对存储的内容做任何格式化处理,所有的数据都是原封不动的保存到文件中,因此适合比较简单的文本或者二进制数据;如果要存储较为复杂的结构化数据,最好定义一套格式规范,方便从文件中解析数据;将数据存储到文件中创建用于保存数据的方法:public static boolean saveAsFile(Context context, String fileName,
2020-07-17 11:23:20
176
原创 复习Android——广播
广播简介在Android中每个应用都可以对任意的广播进行注册,这样就可以接受到指定的广播内容。Android提供了完整的API,允许应用程序自由的发送和接受广播。Android中的广播主要分为以下两种:标准广播标准广播是一种完全异步执行的广播,在广播发出之后,所有的BroadcastReceiver几乎会在同一时间收到这条广播信息,但是此种广播也就无法被拦截。有序广播有序广播是一种同步执行的广播,在广播发出之后,在同一时刻只有一个BroadcastReceiver可以收到此广播信息;
2020-07-16 14:29:51
191
原创 复习Android——Fragment
Fragment是什么Fragment是一种可以嵌入在Activity中的UI片段,它可以让程序更加合理和充分地利用大屏幕的空间。使用Fragment声明两个Fragment的布局文件:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"
2020-07-15 16:27:27
220
原创 复习Android——UI
常见控件及其使用方法TextView常用属性:android:id用于确定唯一标识;android:layout_width用于确定控件的宽度;取值有match_parent(占满父类控件),wrap_content(包裹控件内容)和固定值;固定值常用dp,dp与屏幕密度无关,可以保证在不同手机上的显示效果尽可能的相同;android:layout_height用于确定控件的高度;取值有match_parent(占满父类控件),wrap_content(包裹控件内容)和固定
2020-07-14 17:16:32
207
原创 复习Android——Activity
作用是一种可以包含用户界面的组件,主要用于和用户进行交互;一个应用中可以有零个或者一个或者多个Activity;Layout相关在给元素或者组件添加id时,可以使用如下代码:<Button android:id="@+id/first_button" android:text="@string/app_name" android:layout_width="match_parent" android:layout_height=
2020-07-13 10:22:30
281
原创 软件项目管理课程复习题
项目经理通知客户计划安排在一周内开始项目实施,期望客户团队参加,但在计划日期,客户团队未能参加。若要防止这个问题,项目经理应该事先做什么?A、向客户强调团队参加的重要性B、在计划日期前两天向客户发送提醒C、向客户团队发送一份详细的实施计划并获得批准 √D、向所有项目干系人发送一份详细的实施计划项目经理正在负责一个重要项目的执行,主管突然电话让你去验收另外一个项目,原项目经理辞职,pm怎么办?A、查看所有文件,准备验收 √B、拒绝主管,正在负责一个重要项目C、报告发起人D、团队..
2020-07-08 11:41:56
1872
1
原创 Netty入门P14
添加登录验证功能登录验证处理器示例代码:/** * @program: learnnetty * @description: 服务端验证客户端身份 * @create: 2020-05-11 15:55 **/public class ServerAuthHandler extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Objec
2020-05-24 11:48:28
137
原创 Netty入门P13
ChannelHandler的声明周期示例客户端代码:/** * @program: learnnetty * @description: 测试客户端 * @create: 2020-05-11 15:22 **/public class Client { public static void main(String[] args) { NioEventLoopGroup worker = new NioEventLoopGroup(); Bootst
2020-05-11 15:50:25
127
原创 Netty入门P12
拆包和粘包的例子客户端示例代码:/** * @program: learnnetty * @description: 客户端 * @create: 2020-05-09 13:49 **/public class Client { public static void main(String[] args) { NioEventLoopGroup worker = new NioEventLoopGroup(); Bootstrap bootstrap
2020-05-09 19:40:57
192
原创 Netty入门P11
数据在InboundHandler链上的传递Server示例代码:/** * @program: learnnetty * @description: 事件传播 * @create: 2020-05-08 16:40 **/public class Server { public static void main(String[] args) { NioEventLoopGroup workerGroup = new NioEventLoopGroup();
2020-05-09 11:31:56
1795
原创 Netty入门P10
pipline与channelHandler在服务端或者客户端收到数据之后的处理流程大致分为以下几步:在Netty中pipline和ChannelHandler通过责任链设计模式来组织代码逻辑,并且能够支持逻辑的动态添加和删除,Netty能够支持各类协议的扩展。pipline与channelHandler的构成基本构成示意图:无论在客户端还是服务端,一条连接对应着一个Channel,...
2020-05-08 17:15:12
359
原创 Netty入门P9
收发消息对象新建的消息请求类MsgRequestFrame.java/** * @program: learnnetty * @description: 消息请求实体 * @create: 2020-05-07 16:17 **/public class MsgRequestFrame extends BaseFrame{ /** * 消息内容 */ ...
2020-05-07 17:33:03
141
原创 Netty入门P8
客户端与服务端的交互流程大致流程如下:客户端构建登录用请求对象;客户端编码成ByteBuf;客户端写出数据(writeAndFlush());服务端收到ByteBuf;服务端解码成登录请求;服务端登录校验;服务端构建登录响应对象;服务端编码成ByteBuf;服务端写出数据(writeAndFlush());客户端收到ByteBuf;客户端解码成登录响应;客户端处理响应结...
2020-05-06 17:38:26
145
原创 Netty入门P7
服务端与客户端的通讯协议服务端与客户端使用协议进行通讯的过程大致如下:客户端将一个Java对象按照通讯协议转换成二进制数据包;通过网络将二进制数据包发送到服务端,传输过程由TCP/IP协议负责,与应用层无关;服务端接收到数据包后,按照协议取出二进制数据包中的相应字段,然后根据取出的数据生成Java对象,然后再由业务逻辑处理层解析Java对象;待服务端处理完成后,如果要反馈响应信息,则重...
2020-05-06 12:02:36
111
原创 Netty入门P6
ByteBuf结构ByteBuf结构示意图:根据示意图可以看出:ByteBuf是一个字节容器,容器整体可分为四个部分:已废弃字节部分,此部分的数据是无效的;可读字节部分,此部分的数据是ByteBuf的主体数据,从ByteBuf读取的数据来自此部分;可写字节部分,所有向ByteBuf写入的数据都会保存在此部分;剩余可扩容字节部分,表示ByteBuf还能扩容多少字节;其中前三...
2020-05-05 17:07:25
118
原创 Netty入门P5
客户端发送数据至服务端示例代码Client.java/** * @program: learnnetty * @description: 客户端发送数据 * @create: 2020-05-04 10:31 **/public class Client { public static void main(String[] args) { NioEventLo...
2020-05-04 11:10:17
275
原创 Netty入门P4
客户端启动流程示例代码NettyClient.java/** * @program: learnnetty * @description: Netty客户端 * @create: 2020-05-03 18:28 **/public class NettyClient { public static void main(String[] args) { Nio...
2020-05-04 10:29:49
100
原创 Netty入门P3
Netty编程Netty服务端示例:/** * @program: learnnetty * @description: Netty服务端 * @create: 2020-04-29 16:04 **/public class NettyServer { public static void main(String[] args) { ServerBootst...
2020-05-04 10:29:09
159
原创 Netty入门P2
IO模型IO客户端:/** * @program: learnnetty * @description: IO客户端 * @create: 2020-04-29 10:47 **/public class IOClient { public static void main(String[] args) { new Thread(new Runnable() ...
2020-04-29 15:56:57
101
原创 Netty入门P1
传统Http服务器原理传统Http服务创建连接的步骤:创建一个ServerSocket,监听并绑定一个端口;来自客户端对这个端口的请求;服务器Accept,获得一个来自客户端的Socket连接对象;启动新的处理线程;读取Socket,获取字节流;解码协议,获取Http请求对象;处理Http请求,获得一个结果,封装为一个HttpResponse对象;编码处理,将结果序列化为字节...
2020-04-29 15:53:35
116
原创 Netty入门P0
为什么不用NIO而是NettyNetty做的更多:支持常用应用层协议;解决传输问题:粘包和半包现象;支持流量整形;完善的断连、idle等异常处理;API更友好更强大;隔离变化、屏蔽细节;规避了NIO的bug:NIO的epoll bug:异常唤醒空转导致CPU 100%;IP_TOS参数使用时抛出异常;什么是经典的三种IO模式经典的模式:BIO(阻塞);NIO(...
2020-04-29 15:50:28
140
原创 软件测试复习
梗概为什么要进行软件测试?软件的某些缺陷只有在测试时才会发现;提供对系统质量相关的信息和信息;预防错误的发生;什么是软件缺陷?软件产品中存在的问题,最终表现为用户所需要的功能没有完全实现,不能满足或不能完全满足用户的需求。为什么会存在缺陷?需求的不完善定义;客户-开发者交流失效;对软件需求的偏离;逻辑设计错误;编码错误;不符合文档编制与编码规定;测试过程的不足;...
2020-04-24 00:14:12
802
原创 数据结构复习——红黑树
红黑树是一种近似平衡的二叉搜索树,它能够保证任何一个节点的左右子树的高度差小于两倍(高的树的高度最大是矮的树的高度两倍)。红黑树是满足以下条件的二叉搜索树:每个节点要么是红色,要么是黑色;根节点是黑色的;每个叶节点(空节点)是黑色的;不能有相邻的两个红色节点;从任意一节点到其每个叶子的所有路径都包含相同数目的黑色节点;红黑树示意图1:红黑树示意图2:关键性质:从根节点到叶...
2020-04-24 00:08:42
789
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人