Android Studio使用Lint进行代码检查

  categories:资料  author:

原文地址:http://blog.csdn.net/u010687392/article/details/47835743

Android Studio眼下已经更新到1.4版本号。它作为Google官方推荐的IDE,功能很强大,当中提供了一套静态代码分析工具,它能够帮助我们检查项目中存在的问题,让我们更有规范性的开发App。它能够检查出:xml文件里是否存在hardcode硬编码、unused resources没有使用到的资源、probable bug可能的bug等等。那么如今我们来測试使用它看看:

Android Lint的使用

找到Analyze文件夹下的Inspect Code检查代码选项点击

这里写图片描写叙述

然后弹出以下这个框框,在这个列表选项中我们能够选择Inspect Code的范围,点击OK

这里写图片描写叙述

待分析完成后,我们能够在Inspection栏目中看到检查的结果

这里写图片描写叙述
当中,我们从检查结果可知,它会给出全部在这个项目中不规范的编码、多余的资源、可能的bug、或者其他的一些问题,然后会给出改动的建议供我们參考,尽管这些问题并不会影响App的正常执行,只是这对于项目的规范性和维护性来说是很重要的。
我们从測试的demo中能够看出,这个项目中存在hardcode、unused resources和spelling拼写问题,点击相应的问题后后边会给出问题的详细位置供我们改动,所以这个工具能够让项目具有规范性的开发。

自己定义Android Lint的检查提示

我们知道在xml文件里编写布局时候。假如我们在一个TextView中的text属性上直接写字符串。在textSize属性上写入的值用dp为单位,那么,此时AS中将会有建议提示。如:
这里写图片描写叙述
能够看到这个提示太不明显了。所以我们能够通过更改相应的severity等级来更改提示的等级。如:
默认hardcode的severity等级为warning,我们改动hardcode的severity等级为error,那么在存在硬编码时候将会以error等级提醒我们:
这里写图片描写叙述
再改动testsize假设使用dp为单位的severity等级为:
这里写图片描写叙述
改动完毕后,我们能够看到提示使用红色的波浪线标记了,更直观了,如:
这里写图片描写叙述
并且,Android Lint中还有非常多能够自己去设置的,有兴趣的能够去试试,当然这个仅仅是起提示建议作用,并不会影响程序的正常执行。… 阅读全文

netty基本组件介绍

  categories:资料  author:

Netty做为一款用于搭建高性能网络应用程序的高级框架,由以下几个主要构件组成:

一、Channel

Channel 是java NIO的一个基本构造,可以把channel看作是传入或者传出的数据载体,可以被打开或者关闭,连接或者断开连接。简单来说其实就是我们平常网络编程中经常使用的socket套接字对象。

 

二、EventLoop

EventLoop定义了Netty的核心对象,用于处理IO事件,多线程模型、并发。EventLoop及其相关的设计实现,我们这里不做深入了解。只需要暂时了解以下几点:

1、一个EventLoopGroup包含一个或者多个EventLoop;

2、一个EventLoop在它的生命周期内只和一个Thread绑定;

3、所有有EventLoop处理的I/O事件都将在它专有的Thread上被处理;

4、一个Channel在它的生命周期内只注册于一个EventLoop;

5、一个EventLoop可能会被分配给一个货多个Channel;

其实我们可以简单的把EventLoop及其相关的实现NioEventLoop、NioEventLoopGroup等理解为netty针对我们网络编程时创建的多线程进行了封装和优化,构建了自己的线程模型。

 

三、ChannelHandler和ChannelPipeline

ChannelHandler其实就是用于负责处理接收和发送数据的的业务逻辑,Netty中可以注册多个handler,以链式的方式进行处理,根据继承接口的不同,实现的顺序也不同。

1、ChannelInboundHandler:对接收的信息进行处理。一般用来执行解码、读取客户端数据、进行业务处理等。如ByteToMessageDecoder;

2、ChannelOutboundHandler:对发送的信息进行处理,一般用来进行编码、发送报文到客户端。如MessageToByteEncoder;

而ChannelPipeline为ChannelHandler链提供了容器。

 

四、ByteBuf

网络数据的操作归根到底是字节的操作,Netty的ByteBuf做为一个强大高效的字节容器,提供了更加丰富的API用于字节的操作,同时保持了卓越的功能性和灵活性;

 

总结:

以上四个做为Netty的基本组件,可以理解为Netty把我们之前网络编程中使用到的各部分都进行了优化和高性能的封装,对比到实际的通信流程中,可以简单的用下图直观的表示

—————–

在netty基本组件介绍中,我们大致了解了netty的一些基本组件,今天我们来搭建一个基于netty的Tcp服务端程序,通过代码来了解和熟悉这些组件的功能和使用方法。

首先我们自己创建一个Server类,命名为TCPServer

第一步初始化ServerBootstrap,ServerBootstrap是netty中的一个服务器引导类,对ServerBootstrap的实例化就是创建netty服务器的入口

public class TCPServer {
    private Logger log = LoggerFactory.getLogger(getClass());
    //端口号
    
阅读全文

ArrayBlockingQueue阻塞顺序队列

  categories:资料  author:

介绍

ArrayBlockingQueue是采用数组实现的有界阻塞线程安全队列。如果向已满的队列继续塞入元素,将导致当前的线程阻塞。如果向空队列获取元素,那么将导致当前线程阻塞。

例子

public class ArrayBlockingQueueTest {

    private static BlockingQueue<Food> queue = new ArrayBlockingQueue<Food>(2);
    
    class Producer implements Runnable {

        @Override
        public void run() {
            Food food = new
阅读全文

SynchronousQueue原理详解-公平模式

  categories:资料  author:

原理详解-公平模式

一、介绍

SynchronousQueue是一个双栈双队列算法,无空间的队列或栈,任何一个对SynchronousQueue写需要等到一个对SynchronousQueue的读操作,反之亦然。一个读操作需要等待一个写操作,相当于是交换通道,提供者和消费者是需要组队完成工作,缺少一个将会阻塞线程,知道等到配对为止。

SynchronousQueue是一个队列和栈算法实现,在SynchronousQueue中双队列FIFO提供公平模式,而双栈LIFO提供的则是非公平模式。

对于SynchronousQueue来说,他的put方法和take方法都被抽象成统一方法来进行操作,通过抽象出内部类Transferer,来实现不同的操作。

注意事项:本文分析主要是针对jdk1.8的版本进行分析,下面的代码中的线程执行顺序可能并不能完全保证顺序性,执行时间比较短,所以暂且认定有序执行。

约定:图片中以Reference-开头的代表对象的引用地址,通过箭头方式进行引用对象。

Transferer.transfer方法主要介绍如下所示:

abstract static class Transferer<E> {
    /**
     * 执行put和take方法.
     *
     * @param e 非空时,表示这个元素要传递给消费者(提供者-put);
     *          为空时, 则表示当前操作要请求消费一个数据(消费者-take)。
     *          offered by producer.
     * @param timed 决定是否存在timeout时间。
     * @param nanos 超时时长。
     * 
阅读全文

java线程池ThreadPoolExecutor类使用详解

  categories:资料  author:

在《阿里巴巴java开发手册》中指出了线程资源必须通过线程池提供,不允许在应用中自行显示的创建线程,这样一方面是线程的创建更加规范,可以合理控制开辟线程的数量;另一方面线程的细节管理交给线程池处理,优化了资源的开销。而线程池不允许使用Executors去创建,而要通过ThreadPoolExecutor方式,这一方面是由于jdk中Executor框架虽然提供了如newFixedThreadPool()、newSingleThreadExecutor()、newCachedThreadPool()等创建线程池的方法,但都有其局限性,不够灵活;另外由于前面几种方法内部也是通过ThreadPoolExecutor方式实现,使用ThreadPoolExecutor有助于大家明确线程池的运行规则,创建符合自己的业务场景需要的线程池,避免资源耗尽的风险。

下面我们就对ThreadPoolExecutor的使用方法进行一个详细的概述。

首先看下ThreadPoolExecutor的构造函数

    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue 
阅读全文

关于Android SDK里的compileSdk、minSdk

  categories:资料  author:

本篇文章介绍了Android SDK更新的包里关于compileSdk、minSdk、targetSdk、buildTools、Tools、Platform-tools的概念

0 前言

在开发中经常发现有AS有更新提示,在之前没有完全弄明白这些SDK,Tools的概念前都不敢轻易去更新,总担心更完就编译出错,API不能用==情况。所以对这几个概念进行深度梳理。
1 参考文章

国外一篇很清楚的关于compileSdk、minSdk、targetSdk的文章,建议看完译文后再重新看一遍原文

原文:
picking-your-compilesdkversion-minsdkversion-targetsdkversion

译文:
如何选择 compileSdkVersion, minSdkVersion 和 targetSdkVersion

关于tools的解释:
Android关于buildToolVersion与CompileSdkVersion的区别
2 compileSdk、minSdk、targetSdk到概念

以下内容摘自译文
2.1 compileSdkVersion

compileSdkVersion 告诉 Gradle 用哪个 Android SDK 版本编译你的应用。使用任何新添加的 API 就需要使用对应 Level 的 Android SDK。

需要强调的是 修改 compileSdkVersion 不会改变运行时的行为 … 阅读全文

Android基础之自定义Application

  categories:资料  author:

Application

Android提供了一个Application类,每当应用程序启动时,系统会自动将这个类进行初始化。在项目中,我们在一些工具类采用了单例模式,其生命周期和整个应用程序相同,并且可能直接或者间接的需要Context引用来进行获取资源的操作。那么我们需要一个全局Context也就是Application。

Android基础之Context文章中我们知道,Application生命周期是整个App

自定义Application用途

  • 为得到一个Application对象提供便捷
  • 封装一些通用操作
  • 初始化一些全局的变量数据

对于前两点,Google官方是不建议这样做的。因为使用一个单例模式同样可以做到。但是自定义Application没有任何副作用。而在Application中的onCreate()方法里去初始化各种全局的变量数据是一种比较推荐的做法。

自定义Application

新建一个Application类

新建一个MyApplication并让它继承自Application

public class MyApplication extends Application{
    private static Context mContext;

    @Override
    public void onCreate() {
        super.onCreate();
        mContext = getApplicationContext()
阅读全文

简单的线性规划问题

  categories:资料  author:

简单的线性规划问题在高中数学里体现了数形结合的思想方法,特别是线性规划中的参数问题是考试重点与难点之一,因此根据教学体会,写出一点解线性规划问题方法,希望能给同学们有一点小帮助。

一、二元一次不等式组表示的平面区域

(1)一般地,二元一次不等式Ax+By+C>0在平面直角坐标系中表示直线Ax+By+C=0某一侧所有点组成的平面区域。我们把直线画成虚线以表示区域不包括边界直线。当我们在坐标系中画不等式Ax+By+C≥0所表示的平面区域时,此区域应包括边界直线,则把边界直线画成实线。

(2)由于对直线Ax+By+C=0同一侧的所有点(x,y),把它的坐标(x,y)代入Ax+By+C,所得的符号都相同,所以只需在此直线的同一侧取一个特殊点(x0,y0)作为测试点,由Ax0+By0+C的符号即可判断Ax+By+C>0表示的直线是在Ax+By+C=0哪一侧的平面区域。

(1)

【方法总结】

确定二元一次不等式(组)表示的平面区域的方法:

(1)“直线定界,特殊点定域”,即选作直线,再取特殊点并代入不等式组,若满足不等式组,则不等式(组)表示的平面区域为直线与特殊点同侧的那部分区域;否则就对应与特殊点异侧的平面区域.若直线不过原点,特殊点一般取(0,0)点。

(2)当不等式中带等号时,边界为实线,不带等号时,边界应画为虚线,特殊点常取原点。

二、 目标函数的最值问题

(2)

解决线性规划问题的主要方法策略:

(1)截距法:作出线性约束条件表示的平面区域,将线性目标函数对应的直线方程化为斜截式,再将截距变为0得到过原点的直线,平移此直线使之始终保持与平面区域有公共点,截距的最值即为线性目标函数的最值。此种方法是最常见的解决线性规划问题的策略,对平面区域作图以及线性目标函数对应直线相对于平面区域边界直线的倾斜程度的准确性要求较高。

(2)顶点法:如果可行域是一个多边形围成的区域(包括边界多边形)时,线性目标函数z=f(x,y)的最优解一般在多边形的顶点处取到,排除在边界处取到的情况,先分别计算出线性目标函数z=f(x,y)在各个顶点处的函数值,再比较大小即可。

三、线性规划中的参数问题

(3)

求解线性规划中含参数问题的方法:

(1)若限制条件中含参数,依据参数的不同范围将各种情况下的可行域画出来,寻求最优解,确定参数的值;

(2)若线性目标函数中含有参数,可对线性目标函数的斜率分类讨论,以此来确定线性目标函数经过哪个顶点取得最值,从而求出参数的值;也可以直接求出线性目标函数经过各顶点时对应的参数的值,然后进行检验,找出符合题意的参数值。

———————

今天方法君给大家整理一下线性规划的内容,这是解析几何的重点。但是这块内容高考只考察5分,一般以选填的情况出现,难度不大。同学们需要的是细心,以及熟练掌握直线的相关性质。

线性规划

 

来源:http://www.sohu.com/a/249140600_100250056

——————

1

线性规划是数形结合的体现

线性规划实质上是“数形结合”数学思想方法在一个方面的体现,将最值问题借助图形直观、简便地寻找出来,是一种较快地求最值的方法。在求解应用问题时要特别注意题目中的变量的取值范围,不可将范围盲目扩大.

2
3

探究提高

本题主要考查不等式表示的平面区域、数列求和及不等式的应用等基础知识,考查了数形结合的方法和逻辑推理能力.

不等式组表示的平面区域是各个不等式所表示的平面区域点集的交集,因而是各个不等式所表示的平面区域的公共部分.在封闭区域内找整点数目时,若数目较小时,可画网格逐一数出;若数目较大,则可分x=m逐条分段统计.

5
6

探究提高

线性目标函数的最大(小)值一般在可行域的顶点处取得,也可能在边界处取得.求线性目标函数的最优解,要注意分析线性目标函数所表示的几何意义——在y轴上的截距或其相反数.

7
8

探究提高

解线性规划应用问题的一般步骤是:1分析题意,设出未知量;2列出线性约束条件和目标函数;3作出可行域并利用数形结合求解;4作答.

9
10
11
12

批阅笔记

阅读全文

转微服务写的最全的一篇文章

  categories:资料  author:

今年有人提出了2018年微服务将疯狂至死,可见微服务的争论从未停止过。在这我将自己对微服务的理解整理了一下,希望对大家有所帮助。

1.什么是微服务

1)一组小的服务(大小没有特别的标准,只要同一团队的工程师理解服务的标识一致即可)

2)独立的进程(java的tomcat,nodejs等)

3)轻量级的通信(不是soap,是http协议)

4)基于业务能力(类似用户服务,商品服务等等)

5)独立部署(迭代速度快)

6)无集中式管理(无须统一技术栈,可以根据不同的服务或者团队进行灵活选择)

ps:微服务的先行者Netflix公司,开源了一些好的微服务框架,后续会有介绍。

2. 怎么权衡微服务的利于弊

利:

强模块边界 。(模块化的演化过程:类–>组件/类库(sdk)–>服务(service),方式越来越灵活)

可独立部署。

技术多样性。

弊:

分布式复杂性。

最终一致性。(各个服务的团队,数据也是分散式治理,会出现不一致的问题)

运维复杂性。

测试复杂性。

3. 企业在什么时候考虑引入微服务

从生产力和系统的复杂性这两个方面来看。公司一开始的时候,业务复杂性不高,这时候是验证商业模式的时候,业务简单,用单体服务反而生产力很高。随着公司的发展,业务复杂性慢慢提高,这时候就可以采用微服务来提升生产力了。至于这个转化的点,需要团队的架构师来进行各方面衡量,就个人经验而言,团队发展到百人以上,采用微服务就很有必要了。

有些架构师是具有微服务架构能力,所以设计系统时就直接设计成了微服务,而不是通过单服务慢慢演化发展成微服务。在这里我并不推荐这种做法,因为一开始对业务领域并不是很了解,并且业务模式还没有得到验证,这时候上微服务风险比较高,很有可能失败。所以建议大家在单服务的应用成熟时,并且对业务领域比较熟悉的时候,如果发现单服务无法适应业务发展时,再考虑微服务的设计和架构。

4.微服务的组织架构

如上图左边,传统的企业中,团队是按职能划分的。开发一个项目时,会从不同的职能团队找人进行开发,开发完成后,再各自回到自己的职能团队,这种模式实践证明,效率还是比较低的。

如上图右边,围绕每个业务线或产品,按服务划分团队。团队成员从架构到运维,形成一个完整的闭环。一直围绕在产品周围,进行不断的迭代。不会像传统的团队一样离开。这样开发效率会比较高。至于这种团队的规模,建议按照亚马逊的两个披萨原则,大概10人左右比较好。

5:怎么理解中台战略和微服务

中台战略的由来:马云2015年去欧洲的一家公司supersell参观,发现这个公司的创新能力非常强,团队的规模很小,但是开发效率很高。他们就是采用中台战略。马云感触很深,回国后就在集团内部推出了中台战略。

简单的理解就是把传统的前后台体系中的后台进行了细分。阿里巴巴提出了大中台小前台的战略。就是强化业务和技术中台,把前端的应用变得更小更灵活。当中台越强大,能力就越强,越能更好的快速响应前台的业务需求。打个比喻,就是土壤越肥沃,越适合生长不同的生物,打造好的生态系统。

6:服务分层

每个公司的服务分层都不相同,有的公司服务没有分层,有的怎分层很多。目前业界没有统一的标准。

下面推荐一个比较容易理解的两层结构。

1:基础服务: 比如一个电商网站,商品服务和订单服务就属于基础服务(核心领域服务)。缓存服务,监控服务,消息队列等也属于基础服务(公共服务)

2:聚合服务 :例如网关服务就算一种聚合服务(适配服务)。

这是一种逻辑划分,不是物理划分,实际设计的东西很多很复杂。

7:微服务的技术架构体系

阅读全文

微服务架构介绍

  categories:资料  author:

最近在整理单位的微服务的事情, 因此在网络上搜索到一些资料, 感觉一些内容很全, 需要记录一下就记录下来。

下面这个文章整理的很好, 内容丰富, 但是后面一些内容感觉太复杂了, 学习成本, 实施成本,运维成本都很高, 作为学习的资料还是很好的。

微服务核心架构梳理

业界主流微服务框架的核心原理,包括服务发现,网关,配置中心,监控等组件,功能和架构原理的简单介绍。感谢阅读!

什么是微服务

微服务Microservices之父,马丁.福勒,对微服务大概的概述如下:

就目前而言,对于微服务业界并没有一个统一的、标准的定义(While there is no precise definition of this architectural style ) 。 但通在其常而言,微服务架构是一种架构模式或者说是一种架构风格,它提倡将单一应用程序划分成一组小的服务,每个服务运行独立的自己的进程中,服务之间互相协调、互相配合,为用户提供最终价值。服务之间采用轻量级的通信机制互相沟通(通常是基于 HTTP 的 RESTful API ) 。每个服务都围绕着具体业务进行构建,并且能够被独立地部署到生产环境、类生产环境等。 另外,应尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建,可以有一个非常轻量级的集中式管理来协调这些服务。可以使用不同的语言来编写服务,也可以使用不同的数据存储。

根据马丁.福勒的描述,我总结了一下几点:


(字差,勿嫌)

小服务

小服务,没有特定的标准或者规范,但他在总体规范上一定是小的。

进程独立

每一组服务都是独立运行的,可能我这个服务运行在tomcat容器,而另一个服务运行在jetty上。可以通过进程方式,不断的横向扩展整个服务。… 阅读全文



快乐成长 每天进步一点点      京ICP备18032580号-1