开源框架_android开源框架 - CSDN
  • 深度学习八大开源框架 导读:深度学习(Deep Learning)是机器学习中一种基于对数据进行表征学习的方法,深度学习的好处是用非监督式或半监督式的特征学习、分层特征提取高效算法来替代手工获取特征(feature)。...

    深度学习八大开源框架

    导读:深度学习(Deep Learning)是机器学习中一种基于对数据进行表征学习的方法,深度学习的好处是用监督式或半监督式的特征学习、分层特征提取高效算法来替代手工获取特征(feature)。作为当下最热门的话题,Google、Facebook、Microsoft等巨头都围绕深度学习重点投资了一系列新兴项目,他们也一直在支持一些开源深度学习框架。

    目前研究人员正在使用的深度学习框架不尽相同,有 TensorFlow、Torch 、Caffe、Theano、Deeplearning4j等,这些深度学习框架被应用于计算机视觉语音识别自然语言处理生物信息学等领域,并获取了极好的效果。

    下面让我们一起来认识目前深度学习中最常使用的八大开源框架:

    一.TensorFlow

    深度学习——你需要了解的八大开源框架


    TensorFlow是一款开源的数学计算软件,使用数据流图(Data Flow Graph)的形式进行计算。图中的节点代表数学运算,而图中的线条表示多维数据数组(tensor)之间的交互。TensorFlow灵活的架构可以部署在一个或多个CPU、GPU的台式以及服务器中,或者使用单一的API应用在移动设备中。TensorFlow最初是由研究人员和Google Brain团队针对机器学习和深度神经网络进行研究所开发的,目前开源之后可以在几乎各种领域适用。

    Data Flow Graph: 使用有向图的节点和边共同描述数学计算。graph中的nodes代表数学操作,也可以表示数据输入输出的端点。边表示节点之间的关系,传递操作之间互相使用的多位数组(tensors),tensor在graph中流动——这也就是TensorFlow名字的由来。一旦节点相连的边传来了数据流,节点就被分配到计算设备上异步的(节点间)、并行的(节点内)执行。

    深度学习——你需要了解的八大开源框架


    TensorFlow的特点:

    机动性: TensorFlow并不只是一个规则的neural network库,事实上如果你可以将你的计算表示成data flow graph的形式,就可以使用TensorFlow。用户构建graph,写内层循环代码驱动计算,TensorFlow可以帮助装配子图。定义新的操作只需要写一个Python函数,如果缺少底层的数据操作,需要写一些C++代码定义操作。

    可适性强: 可以应用在不同设备上,cpus,gpu,移动设备,云平台等

    自动差分: TensorFlow的自动差分能力对很多基于Graph的机器学习算法有益

    多种编程语言可选: TensorFlow很容易使用,有python接口和C++接口。其他语言可以使用SWIG工具使用接口。(SWIG—Simplified Wrapper and Interface Generator, 是一个非常优秀的开源工具,支持将 C/C++ 代码与任何主流脚本语言相集成。)

    最优化表现:  充分利用硬件资源,TensorFlow可以将graph的不同计算单元分配到不同设备执行,使用TensorFlow处理副本。

    二.Torch

    深度学习——你需要了解的八大开源框架


    Torch是一个有大量机器学习算法支持的科学计算框架,其诞生已经有十年之久,但是真正起势得益于Facebook开源了大量Torch的深度学习模块和扩展。Torch另外一个特殊之处是采用了编程语言Lua(该语言曾被用来开发视频游戏)。

    Torch的优势:

    构建模型简单

    高度模块化

    快速高效的GPU支持

    通过LuaJIT接入C

    数值优化程序等

    可嵌入到iOS、Android和FPGA后端的接口 

    三.Caffe

    深度学习——你需要了解的八大开源框架

    Caffe由加州大学伯克利的PHD贾扬清开发,全称Convolutional Architecture for Fast Feature Embedding,是一个清晰而高效的开源深度学习框架,目前由伯克利视觉学中心(Berkeley Vision and Learning Center,BVLC)进行维护。(贾扬清曾就职于MSRA、NEC、Google Brain,他也是TensorFlow的作者之一,目前任职于Facebook FAIR实验室。)

    Caffe基本流程:Caffe遵循了神经网络的一个简单假设——所有的计算都是以layer的形式表示的,layer做的事情就是获得一些数据,然后输出一些计算以后的结果。比如说卷积——就是输入一个图像,然后和这一层的参数(filter)做卷积,然后输出卷积的结果。每一个层级(layer)需要做两个计算:前向forward是从输入计算输出,然后反向backward是从上面给的gradient来计算相对于输入的gradient,只要这两个函数实现了以后,我们就可以把很多层连接成一个网络,这个网络做的事情就是输入我们的数据(图像或者语音等),然后来计算我们需要的输出(比如说识别的标签),在训练的时候,我们可以根据已有的标签来计算损失和gradient,然后用gradient来更新网络的参数。

    Caffe的优势:

    上手快:模型与相应优化都是以文本形式而非代码形式给出

    速度快:能够运行最棒的模型与海量的数据

    模块化:方便扩展到新的任务和设置上

    开放性:公开的代码和参考模型用于再现

    社区好:可以通过BSD-2参与开发与讨论

    四.Theano

    深度学习——你需要了解的八大开源框架

    2008年诞生于蒙特利尔理工学院,Theano派生出了大量深度学习Python软件包,最著名的包括Blocks和Keras。Theano的核心是一个数学表达式的编译器,它知道如何获取你的结构。并使之成为一个使用numpy、高效本地库的高效代码,如BLAS和本地代码(C++)在CPU或GPU上尽可能快地运行。它是为深度学习中处理大型神经网络算法所需的计算而专门设计的,是这类库的首创之一(发展始于2007年),被认为是深度学习研究和开发的行业标准。

    Theano的优势:

    集成NumPy-使用numpy.ndarray

    使用GPU加速计算-比CPU快140倍(只针对32位float类型)

    有效的符号微分-计算一元或多元函数的导数

    速度和稳定性优化-比如能计算很小的x的函数log(1+x)的值

    动态地生成C代码-更快地进行计算

    广泛地单元测试和自我验证-检测和诊断多种错误

    灵活性好

    五.Deeplearning4j

    深度学习——你需要了解的八大开源框架

    顾名思义,Deeplearning4j是“for Java”的深度学习框架,也是首个商用级别的深度学习开源库。Deeplearning4j由创业公司Skymind于2014年6月发布,使用 Deeplearning4j的不乏埃森哲、雪弗兰、博斯咨询和IBM等明星企业。DeepLearning4j是一个面向生产环境和商业应用的高成熟度深度学习开源库,可与Hadoop和Spark集成,即插即用,方便开发者在APP中快速集成深度学习功能,可应用于以下深度学习领域:

    人脸/图像识别

    语音搜索

    语音转文字(Speech to text)

    垃圾信息过滤(异常侦测)

    电商欺诈侦测

    除了以上几个比较成熟知名的项目,还有很多有特色的深度学习开源框架也值得关注:

    六.ConvNetJS

    深度学习——你需要了解的八大开源框架

    这是斯坦福大学博士生Andrej KarPathy开发的浏览器插件,基于万能的JavaScript可以在你的游览器中训练深度神经模型。不需要安装软件,也不需要GPU。

    七.MXNet

    深度学习——你需要了解的八大开源框架

    出自CXXNet、Minerva、Purine 等项目的开发者之手,主要用C++ 编写。MXNet 强调提高内存使用的效率,甚至能在智能手机上运行诸如图像识别等任务。

    MXNet的系统架构如下图所示:

    深度学习——你需要了解的八大开源框架

    从上到下分别为各种主语言的嵌入,编程接口(矩阵运算,符号表达式,分布式通讯),两种编程模式的统一系统实现,以及各硬件的支持。

    八.Chainer

    深度学习——你需要了解的八大开源框架

    来自一个日本的深度学习创业公司Preferred Networks,今年6月发布的一个Python框架。Chainer 的设计基于 define by run原则,也就是说该网络在运行中动态定义,而不是在启动时定义。


    展开全文
  • Java常用开源框架总结,主要包括Apache commons、Apache commons lang、Apache commons-io、commons-fileupload。
  • Spring开源框架

    2019-01-16 22:23:25
    为了解决企业应用开发的复杂性而创建的一个轻量级的Java 开发框架 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 Spring框架的目标是使得Java EE应用程序的开发更加简捷 基本...

    为了解决企业应用开发的复杂性而创建的一个轻量级的Java 开发框架

    简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

    Spring框架的目标是使得Java EE应用程序的开发更加简捷

    基本框架:AOP、JEE、WEB、CORE、DAO、ORM

    三种依赖注入方式:属性(Setter方法)注入,构造注入和接口注入

    Spring  DAO:Spring提供了对JDBC的操作支持:JdbcTemplate模板工具类 。

    Spring  AOP:Spring提供面向切面的编程,可以给某一层提供事务管理

    Spring  Core:提供IOC容器对象的创建和处理依赖对象关系 。

    Spring  JEE:J2EE开发规范的支持,例如EJB 。

    Spring  WEB:Spring提供了对Struts、Springmvc的支持,支持WEB开发。与此同时Spring自身也提供了基于MVC的解决方案 

    Spring  ORM:Spring可以与ORM框架整合

     

     

    IOC容器

    就是具有依赖注入功能的容器,是可以创建对象的容器,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。通常new一个实例,控制权由程序员控制,而"控制反转"是指new实例工作不由程序员来做而是交给Spring的容器来做。所以每次调用不再实例化,加一个声明即可

    简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦,如下图:

     

    BeanFactory 是所有Spring应用的核心。Spring框架是建立在这个模块之上的,这也使得Spring成为一个容器。

    IOC实现了松耦合。依赖被注入到对象,而不是创建或寻找依赖对象

     

     

    AOP容器(切面编程)

    可以为某一类对象进行监督和控制从而达到对一个模块扩充的功能。比如说日志、安全、缓存等那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码

     

    切面(Aspect):其实就是共有功能的实现。

    通知(Advice):是切面的具体实现。

    连接点(Joinpoint):就是程序在运行过程中能够插入切面的地点。

    切入点(Pointcut):用于定义通知应该切入到哪些连接点上。

    目标对象(Target):就是那些被通知的对象。

    代理对象(Proxy):将通知应用到目标对象之后被动态创建的对象。

    织入(Weaving):将切面应用到目标对象从而创建一个新的代理对象的过程。

    把应用的业务逻辑与系统的服务分离开来

    @Aspect
    @Component
    public class LogAspect {
        private static final Logger logger =LoggerFactory.getLogger(LogAspect.class);
        @Before("execution(* com.example.demo.controller.UserController.*(..))")
        public void beforeMethod(){//所有调用之前
            logger.info("beforeMethod"+new Date());
        }
        @After("execution(* com.example.demo.controller.UserController.*(..))")
        public void afterMethod(){//所有调用之后
            logger.info("afterMethod"+new Date());
        }
    }

    Bean

        每个Bean定义只存在一个实例,即Bean的scope默认是singleton的

     

     

    实际例子

    public class Hello {
        private String mess;
        public void steMess(String mess){
            this.mess=mess;
        }
        public void say(){
            System.out.println("hello"+mess);
        }
        public void setMess(String mess) {
            this.mess = mess;
        }
        public String getMess() {
            return mess;
        }
    }
    
    public static void main(String[] args){
            ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
            Hello hello=(Hello)context.getBean("hello");
            hello.say();
    }
    
    //xml配置
    <bean id="hello" class="Hello">
               <property name="mess" value="Spring">
               </property>
    </bean>
    
    
    

    我们可以把对象的创建和管理工作交给Spring去完成,不需要自己去new对象,也不要去设置对象的属性,只要写好Spring的配置文件,Spring就可以帮我们去做

     

    SpringMVC

    SpringMVC实现了mvc设计模式的web框架。

    MVC是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据可以分别用柱状图饼图来表示。C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新。

    视图包括Adobe Flash和像XHTMLXML/XSL,WML等一些标识语言和Web services.

    模型表示企业数据和业务规则

    控制器接受用户的输入并调用模型和视图去完成用户的需求

     

    首先用户发出请求,请求到达SpringMVC的前端控制器(DispatcherServlet),前端控制器根据用户的url请求处理器映射器查找匹配该url的handler,并返回一个执行链,前端控制器再请求处理器适配器调用相应的handler进行处理并返回给前端控制器一个modelAndView,前端控制器再请求视图解析器对返回的逻辑视图进行解析,最后前端控制器将返回的视图进行渲染并把数据装入到request域,返回给用户。

    spring mvc的入口是servlet,而struts2是filter。

    spring会稍微比struts快。spring mvc是基于方法的设计,而sturts是基于类

    展开全文
  • 是非对错,我们在这里也不多做评判,本文呢为大家整理了百度开源的70+项目,看看有没有感兴趣的。本文内容综合整理自oschina、github。 1. JavaScript图表库 ECharts ECharts开源来自百度商业前端数据可视化...

    百度,一家让人既爱又恨的企业,血友吧贴吧被卖,魏则西事件的持续发酵,一时间将百度推到了舆论的风口浪尖上。是非对错,我们在这里也不多做评判,本文呢为大家整理了百度开源的70+项目,看看有没有感兴趣的。本文内容综合整理自oschina、github。

    1. JavaScript图表库 ECharts

    ECharts开源来自百度商业前端数据可视化团队,基于html5 Canvas,是一个纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表。创新的拖拽重计算、数据视图、值域漫游等特性大大增强了用户体验,赋予了用户对数据进行挖掘、整合的能力。

    2. 分布式配置管理平台 Disconf

    Distributed Configuration Management Platform(分布式配置管理平台)专注于各种 分布式系统配置管理 的通用组件/通用平台, 提供统一的配置管理服务。

    3. 移动WebApp开发框架 Clouda

    Clouda是基于node.js的Webapp开发框架,在使用Clouda时需要安装node.js和MongoDB。

    4. 全新 3D 可视化库 ECharts-X

    ECharts-X是 ECharts 团队推出的全新 3D 可视化库,它是基于 ECharts 的扩展,底层深度整合了 WebGL 库QTEK和 Canvas2D 库ZRender。

    5. 百度的Javascript库 Tangram

    Tangram是Baidu开发的一套简单可依赖的Javascript库。

    6. 在线富文本编辑器 UMeditor

    UMeditor,简称UM,是为满足广大门户网站对于简单发帖框,或者回复框需求所定制的在线富文本编辑器。 UM的主要特点就是容量和加载速度上的改变,全版本的代码量为125k,而且放弃了使用传统的iframe模式,采用了div的加载方式, 以达到更快的加载速度和零加载失败率。

    7. Android自动化测试框架 Cafe

    Cafe 测试框架是一款来自百度QA部门的具有开创性意义的Android平台的自动化测试框架,框架覆盖了Android自动化测试的各种需求。框架致力于实现跨进程测试、快速测试、深度测试,解决了Android自动化测试中的诸多难题,比如业界一直没有解决的跨进程测试问题。

    8. Web 端的 UI 框架 BlendUI

    BlendUI 是百度公司的一个 Web 前端 UI 框架。BlendUI 能让Webapp的体验和交互与Native媲美。

    9. 百度音乐播放内核 MuPlayer

    MuPlayer 是一款跨平台、轻量级的音频播放解决方案,是百度@音乐前端团队开发维护的浏览端音频播放内核,它基于HTML5 Audio及Flash音频技术,已在百度音乐多个线上产品线中应用,具备很强的灵活性和稳定性。

    10. 轻量级UI组件 Magic

    Magic是用JavaScript脚本开发的轻量级UI组件,具有性能高效、代码量小、支持多种初始化方式等方面的优势,Web前端开发者可以使 用Magic快速搭建前端功能比较复杂的网站。Magic的每个组件都有非常丰富的接口和事件处理,网站也提供了详细的使用文档和Demo演示。Web前 端开发者可以通过定制组件、初始化方式和插件获得最轻量级版本。

    11. 高性能RPC框架 BGCC

    BGCC(音:[bigsisi:])是百度具有完全知识产权的跨平台、多语言、面向对象与服务的轻量级高性能RPC框架。 它支持事务级别的服务端消息主动推送,强大的接口级事务管理功能,包含自定义的通信协议、接口描述语言(bidl)、 强大的代码生成引擎(bidl2sl),Java、C++通信无缝整合。

    12. 分布式表格系统 Tera

    Tera 是一个高性能、可伸缩的数据库系统,被设计用来管理搜索引擎万亿量级的超链与网页信息。为实现数据的实时分析与高效访问,我们使用按行键、列名和时间戳全局排序的三维数据模型组织数据,使用多级Cache系统,充分利用新一代服务器硬件大内存、SSD盘和万兆网卡的性能优势,做到模型灵活的同时,实现了高吞吐与水平扩展。

    13. 基于 Node 的 JavaScript 同构解决方案 rebas

    基于 Node 的 JavaScript 同构解决方案。提供了 saber 的服务端运行环境,使其具备从 SPA 到 MPA,从前端渲染到后端渲染的深度响应式能力。

    14. 面向c/c++语言的构建工具 Broc

    broc是一款面向c/c++语言的构建工具,提供了编译、分支依赖、依赖模块下载等功能。不同于make, cmake等以库文件链接的编译方式,broc将依赖库源代码与程序源代码一并同时进行编译,这种方式可以避免程序源代码与依赖库编译选项或平台不一致导 致的软件兼容性问题;broc支持编译结束后自动运行单元测试用例;借助Jenkins broc还能完成软件的持续集成。

    15. 富文本编辑器 Ueditor

    UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点。

    16. 在线脑图编辑器 Kity Minder

    KityMinder 是百度FEX团队的f-cube小组(原UEditor小组)的又一力作。作为一款在线的脑图编辑工具,它有着很多Native编辑工具的交互体验。KM与UE有着一样的宗旨,就是注重最终用户的使用体验。同时,它充分发挥了Web云存储的优势,可以直接将编辑中的脑图同步到云端。此外,借由独创的 “云盘分享”功能,用户可以一键将当前编辑的脑图直接生成在线链接共享给其他用户,实现无缝沟通。

    17. 轻量级的Canvas类库 ZRender

    zrender(Zlevel Render) 是一个轻量级的Canvas类库,MVC封装,数据驱动,提供类Dom事件模型,让canvas绘图大不同!

    18. 文件上传组件 WebUploader

    WebUploader 是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件。在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览器,延用原来的FLASH运行时,兼容IE6+,Andorid 4+,IOS 6+。两套运行时,同样的调用方式,可供用户任意选用。

    19. 手势识别与事件库 Touch.js

    Touch.js是移动设备上的手势识别与事件库, 由百度云Clouda团队维护,也是在百度内部广泛使用的开发工具。

    20. 地图可视化工具库 Mapv

    Mapv 是一款基于百度地图的大数据可视化开源库,可以用来展示大量的点、线、面的数据,每种数据也有不同的展示类型,如直接打点、热力图、网格、聚合等方式展示数据。

    21. 专注于移动端的滑动解决方案 iSlider

    iSlider 是个非常平滑的滑块,支持移动端 WebApp,HTML5App 和混合型的 App。

    22. 百度UI库 ESUI

    ESUI是一套简单的UI Library,提供一系列的控件,能满足基本页面交互功能。ESUI的API与默认视觉皮肤遵循BAIDU ECOMUI标准。

    23. jQuery的弹窗插件 wBox

    wBox轻量级的弹出窗口jQuery插件,基于jQuery1.4.2开发,主要实现弹出框的效果,并且加入了很多有趣的功能,比如callback函数,显示隐藏层,Ajax页面,iframe嵌入页面等功能。

    24. 百度BI平台 BiPlatform

    百度开源的新一代一站式敏捷bi平台,提供报表和OLAP服务的敏捷BI平台。

    25. 前端集成解决方案 F.I.S

    F.I.S(FIS)所提供的集成解决方案依托于一套灵活高效的 编译工具,F.I.S借助该编译平台对前端开发资源进行整合。接触F.I.S,可以从该平台入手。

    26. 移动端组件库 Global Mobile UI

    GMU(Global Mobile UI)是百度前端通用组开发的移动端组件库,具有代码体积小、简单、易用等特点,组件内部处理了很多移动端的bug,覆盖机型广,能大大减少开发交互型组件的工作量,非常适合移动端网站项目。

    27. RPC框架 sofa-pbrpc

    sofa-pbrpc(sofa protobuf-based rpc)是使用Boost::Asio实现的基于Google Protocol Buffers RPC框架的网络通信库,在百度公司各部门得到广泛使用。

    28. 百度文件系统 BFS-Baidu

    百度的核心数据库Tera将数据持久化在分布式文件系统上,分布式文件系统的性能、可用性和扩展性对整个上层搜索业务的稳定性与效果有着至关重要的影响。

    29. 企业级标准加载器 ESL

    ESL 是一个浏览器端、符合AMD的标准加载器,适合用于现代Web浏览器端应用的入口与模块管理。

    30. 前端移动框架 Saber

    Saber 是 模块化、组合式 的前端移动框架。

    31. 百度mysql分库分表中间件服务器 heisenberg

    heisenberg 是百度的熊照同学(id:brucexx)编写的一款基于MySQL协议之上的分库分表中间件服务器,支持各种灵活(velocity脚本自定义)的分库分表规则,做到应用和分库分表相隔离,并且为mysql进行dbproxy,减少了db的连接IO压力,并且可做到读写分离以及replication的手工切换。

    32. doc 文档在线编辑和预览 wordonline

    wordonline 是在线编辑和预览 .doc 和 .docx 文档的工具。

    33. JS模板引擎 BaiduTemplate

    baiduTemplate希望创造一个用户觉得“简单好用”的JS模板引擎。

    34. 在线文件管理器 UFinder

    UFinder 是百度前端团队基于页面级的文件管理应用。

    35. webSlide

    webSlide是用于在线PPT演示文档的javascript框架。

    36. 网络幻灯片 nodePPT

    nodePPT 是使用nodejs写的网络幻灯片。

    37. 前端模块化解决方案 fis-pure

    fis-pure 是基于FIS的纯前端模块化解决方案pure。

    pure是基于FIS二次封装能力封装而成的解决方案,可以直接使用,也可以参考fis-pure自行封装或组合使用插件来构建属于自己的一体化解决方案。

    38. J2EE Velocity 前端集成方案 jello

    jello 是针对服务端为 JAVA + Velocity 的前端集成解决方案。jello 为优化前端开发而生,提供前后端开发分离、自动性能优化、模块化开发机制等功能。

    39. protobuf的Java开发包 jprotobuf

    jprotobuf是针对Java程序开发一套简易类库,目的是简化java语言对protobuf类库的使用,使用jprotobuf可以无需再去了解.proto文件操作与语法,直接使用java注解定义字段类型即可。

    40. 人工智能软件 WARP-CTC

    WARP-CTC 是百度硅谷 AI 研究所 (SVAIL) 开源的百度关键人工智能 (AI) 软件。

    41. 百度云Go语言SDK bcsgo

    百度云存储服务Go语言SDK。

    42. 前端模块加载解决方案 modJS

    modJS 是一套的前端模块加载解决方案。与传统的模块加载相比,modJS 会根据产品实际使用场景,自动选择一种相应的方案,使最终的实现非常轻量简洁。

    43. 公式编辑器 KityFormula

    Kity Formula 为您提供公式表达式解析,可视化公式编辑,公式完美展示于一身的web端的整体解决方案。

    44. 高品质的 WebGL 类库 Qtek

    Qtek (WebGL Graphic Library) 是一个高品质的 WebGL 类库,目前仍处于实验阶段。

    物理组件:

    https://github.com/pissang/qtek-physics

    2D 组件

    https://github.com/pissang/qtek-2d

    45. 集群操作系统 Galaxy

    Galaxy是一个数据中心操作系统,目标是最大化资源的利用率与降低应用部署运维代价,支持万台集群资源调度与管理,目前主要服务于百度网页搜索离线架构业务,解决分布式文件系统,分布式表格系统,以及上层计算模块运维与部署问题。

    46. 富浏览器端web应用框架 ER

    ER 是百度公司的一个富浏览器端web应用的框架,适用于并能很方便地构建 一个整站式的AJAX web应用。

    47. 深度学习平台 PaddlePaddle

    PaddlePaddle(并行分布式深度学习)是一个易于使用的、高效的、灵活的和可扩展的深度学习平台,它最初是百度的科学家和工程师为了能让百度产品能提供深度学习而开发的。

    48. 前端统计框架 ALog

    ALog 是前端统计框架。

    49. Baidu Push SDK

    Baidu Push SDK 是百度的云推送 SDK 开发包。

    50. 企业级前端应用开发平台 EDP

    EDP是基于 Node 的前端应用开发平台,是一个企业级前端应用的开发平台,提供了常用的项目管理工具、包管理工具、调试工具、构建工具、代码生成工具、代码检测工具等一系列开发时的支持,并允许用户自定义自己的扩展。

    51. HTML5 音乐播放器 Player

    Player 是 HTML5 版本音乐播放器,支持 iOS 设备。

    演示地址:http://4.qdemo.sinaapp.com/html5/chrome/

    52. jQuery 遮罩插件 SlipHover

    SlipHover 是一个基于 jQuery 的插件,它能够感知鼠标移动方向,并在相应的方向(或反方向)以动画的方式显示出一个遮罩层,用来显示标题或描述,应用到幻灯片或相册中是个不错的选择。 SlipHover 还支持自定义遮罩高度、动画时间、字体颜色、背景颜色、文字排版等等。

    53. 模板引擎 ETPL

    ETPL是一个灵活、具有强大复用能力的高性能的模板引擎,适用于WEB前端应用中视图的生成,特别是SPA(Single Page APP)类型的应用。

    54. 基于 LESS 的样式工具库 EST

    EST(ECOM Styling Toolkit)是一个基于 LESS 的样式工具库,帮助您更轻松地书写 LESS 代码。EST提供了一系列方便 快捷的 mixin,只在调用时才输出代码。est 不希望提供直接给 HTML 调用的类名,用「样式类」污染 HTML 代码的语义。当然您也可以根 据自己的项目需求基于 est 搭建样式类库,提供类名接口来进行快速开发。

    演示地址:http://ecomfe.github.io/est/fiddle/

    55. 基于 SVG 的矢量图形库 Kity

    Kity 是一个基于 SVG 的矢量图形库,帮助你快速在页面上创建和使用矢量元素。

    56. 前端资源聚合平台 Lights

    Lights 是FIS包管理工具。提供便捷、易用的资源安装、发布、搜索,管理工具。用于团队间快速共享资源,提升开发效率。 

    57. EDP 扩展 edpx-zhixin

    edpx-zhixin 是 edp 的一个扩展,提供给百度的FE开发搜索结果页模板的工具。

    58. 服务虚拟化 Terminator

    服务虚拟化指的就是虚拟出不稳定、不可用、未开发完全的服务。

    59. 前端集成解决方案 baidu yogurt

    yogurt 是基于 fis 扩展针对服务端为 express.js 的前端集成解决方案。

    60. 移动 Web 的 CSS 样式工具库 Rider

    rider是一个基于 Stylus、专注于移动 Web 的 CSS 样式工具库。

    61. kraken.js 扩展 Yog

    Yog 是一个基于 Express.js 的 Node.js Web 应用引导模块,扩展了 kraken.js。

    62. 基于Nodejs 的前端工具集 FEinit

    FEinit 是基于Nodejs 的前端工具集,因为是在windows系统开发,所以目前仅适合 windows 系统。

    63. Node Log 统计方案 yog-log

    yog-log 是 Node Log 统计方案,是yog框架的log统计模块,支持中间件或者单独使用等方式,兼容ODP日志格式与配置。

    64. 轻量级覆盖率测试工具 logcover

    logcover 是一款非常便捷的统计测试用例异常日志覆盖率的工具。可清晰地分析出程序源代码中异常日志的覆盖情况,检验测试充分度,指导测试用例完善。 

    65. 知心组件库 moye

    Moye 是 ECOM UI 1.1 规范的一个轻量级实现。

    66. fis-postprocessor-amd

    fis-postprocessor-amd 能识别 js 中 amd 依赖,自动包转 isMod  的 js 为 amd。

    67. EDP 的移动端扩展 EDPM

    edpx-mobile(EDPM) 是 EDP 的移动端扩展。EDPM 是对 edp 功能的补充,为移动项目提供项目初始化、脚手架、调试服务器等功能。

    68. 前端代码风格工具 FECS

    FECS 是基于 Node.js 的前端代码风格工具。

    69. WEB 组件规范 xspec

    xspec 是一系列基于WEB COMPONENTS的组件规范,致力于借助规范的力量让组件发挥更大的价值。

    70. yog-pm

    yog-pm是在pm2的基础上提供了几个增强命令,提高pm2的易用性和稳定性。

    71. Express.js 中间件 yog-view

    yog-view 是一个 Express.js 中间件,用来优化 js/css 输出排序,允许在 bigpipe 模式中显示。


    原文:http://www.cnblogs.com/kingboy2008/p/6117741.html


    【关于我们】

    内推君(微信众号ourpush),专注于国内各大互联网公司社会招聘内推。每天更新最新互联网名企(包括但不限于网易游戏、BAT、网易互联网、小米、京东、乐视、携程等名企)内推信息,有技术岗、有产品岗、有运营岗、有设计岗、有交互岗、有销售岗,更有其他N多相关岗位!更多内推信息请扫描以下二维码关注查阅。



    展开全文
  • 10款顶级web开源框架

    2017-08-05 14:09:27
    作为开发者,我们需要了解一些 宝贵的CSS UI开源框架资源,它们可以帮助我们更快更好地实现一些现代化的界面,包括一些移动设备的网页界面风格设计。本文分享了10个顶级的CSS UI开源框架,有几个确实不错,一起来看...
    随着CSS3和HTML5的流行,我们的WEB页面不仅需要更人性化的设计理念,而且需要更酷的页面特效和用户体验。作为开发者,我们需要了解一些 宝贵的CSS UI开源框架资源,它们可以帮助我们更快更好地实现一些现代化的界面,包括一些移动设备的网页界面风格设计。本文分享了10个顶级的CSS UI开源框架,有几个确实不错,一起来看看。

    1、QUI – 最流行的Web前端UI框架QUI是由twitter推出的Web前端UI框架,它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架。它使用了最新的浏览器技术,QUI提供了时尚的排版样式,表单,buttons,表 格,网格系统等等。

    2、jQuery UI - 基于jQuery的开源Javascript框架
    jQuery UI是一款基于jQuery的开源Javascript框架,jQuery UI框架主要提供了用户交互、动画、特效和可更换主题的可视控件,让开发者可以更方便地实现网页交互界面,jQuery UI的整个框架比较庞大,但你也可以根据自己需要使用的功能生成适合自己的框架底层。jQuery UI界面设计非常漂亮,值得一试。
    官方网站:http://jqueryui.com/

    3、jQuery UI Bootstrap
    它是jQuery UI和Bootstrap的集成,它是Bootstrap样式的,因此外观比较漂亮,同时它拥有jQuery UI的控件功能,这也方便开发者快速地创建一个网页控件。
    官方网站:https://github.com/jquery-ui-bootstrap/jquery-ui-bootstrap/

    4、BootMetro - Metro风格的CSS框架
    BootMetro是一款基于Bootstrap的前端UI框架,BootMetro的特点是可以很方便地构建类似Windonws 8扁平化风格的网页界面,效果非常不错。分享一个最好用的UI前端框架!
    官方网站:http://aozora.github.io/bootmetro/

    5、Flat UI - 扁平风格 UI 工具包
    Flat UI是一套精美的扁平风格 UI 工具包,基于 Twitter Bootstrap 实现。这套界面工具包含许多基本的和复杂的 UI 部件,例如按钮,输入框,组合按钮,复选框,单选按钮,标签,菜单,进度条和滑块,导航元素等等。
    官方网站:https://github.com/designmodo/Flat-UI

    6、网易CSS框架 NEC
    NEC是网易推出的开源前端CSS框架,NEC提供了丰富UI代码库和插件,可以极大的帮助开发人员提高开发效率。即使你并非前端专业开发人员,利用NEC你也可以快速地构建属于自己的网页应用。
    官方网站:http://nec.netease.com/

    7、Alloy UI – 功能强大的CSS UI框架
    Alloy UI是基于YUI 3的前段UI框架,包含一套丰富的(超过60)UI 部件,如图片库,对话框,树形结构,面板,自动完成,按钮,日历控件,工具条等。
    官方网站:http://alloyui.com/

    8、Cardinal – 移动端的CSS UI框架
    Cardinal 是一个小型的移动优先的 CSS 框架,提供很多有用的默认样式、可缩放排版、可重用模块和一个简单的响应式表格系统。
    官方网站:http://cardinalcss.com/

    9、快速开发CSS的框架 CSScaffold
    不同于许多CSS框架,它必须依靠PHP与Apache的mod_rewrite来执行,但也因为需要这两种东西,让CSScaffold变得很神奇、很方便,写起CSS来又快又轻松!
    http://www.w3avenue.com/2009/10/13/csscaffold-php-based-css-framework/

    10、后台UI开发框架 MuseUI
    一款基于bootstrap风格,兼容于主流浏览器(包括IE6)的后端UI开发组件。
    官方网站:http://git.oschina.net/muse/museui
    展开全文
  • 开源框架

    2016-11-14 15:32:02
    0.1为什么要使用开源框架(轮子) 提高开发速度 提高开发质量 0.2选择开源框架的原则 选择活跃度和人气高的项目 聚合性框架要放弃使用,例如Afinal,xUtils, 大而全的框架容易导致牵一发而动全身; last commit超过...

    0.1为什么要使用开源框架(轮子)

    1. 提高开发速度
    2. 提高开发质量

    0.2选择开源框架的原则

    1. 选择活跃度和人气高的项目
    2. 聚合性框架要放弃使用,例如Afinal,xUtils, 大而全的框架容易导致牵一发而动全身;
    3. last commit超过一年以上或者issues一大堆没有fix的框架不要用;
    4. 没有详细的文档,谨慎使用
    5. 依赖另外的jar比较多,扩展性不好的,谨慎使用

    常见开源库

    依赖注入

    1.1依赖注入_概念

    • 依赖(Dependency)

      • 如果在ClassA中用到了ClassB的实例,我们通常会直接new一个ClassB的对象,这种情况称为调用者ClassA对被调用者ClassB有一个依赖
      • 例如下面的代码中HRSystem就依赖与Person.
      • 示例代码中Person这种直接初始化的方式也叫Hard Init方式,弊端在于两个类之间不够独立,如果我们更改了Person的构造函数,所有使用到Person初始化方法的代码都要进行修改.

        public class HRSystem {
        
            public static void main(String[] args) {
                Person person = new Person();
        
            }
        }
        
    • 依赖注入(DI:Dependency Injection):

      • 指程序运行过程中,调用者(HRSystem)需要被调用者(Person)的辅助,但是创建被调用者(Person)的工作不再由调用者(HRSystem)来完成,因此称为控制反转(IOC:Inversion of Control),而是由相关的容器控制程序将被调用者(Person)的对象在外部创建出来并注入到调用者(HRSystem)的引用中

        public class HRSystem {
        
            @Inject
            Person person;
        
            public static void main(String[] args) {
            }
        }
        
    • 为什么要使用依赖注入

      • 依赖注入是实现控制反转的方式之一(另一方式是依赖查找),目的就是为了让调用者和被调用者之间解耦
      • 可以注入依赖的模拟实现,使得测试变得更加简单.

    1.2依赖注入_Butterknife

    • 主页: https://github.com/JakeWharton/butterknife
    • 用途: 主要用来简化控件查找,事件注册等
    • 使用步骤:

      1. 在app/build.gradle文件中dependencies节点添加:

        compile 'com.jakewharton:butterknife:7.0.1'
        
      2. 安装Android ButterKnife Zelezny插件:在Android Studio中点击 File–>Settings–>Plugins–>Browse repositories,搜索Android ButterKnife Zelezny插件,安装成功以后重启Android Studio.

      3. Activity/Fragment布局文件中定义控件id
      4. 在Activity/Fragment 代码中,将鼠标放在布局文件的引用上(即R.layout.activity_main中的activity_main上面),此时按快捷键Alt + Insert或鼠标右键选择Generate
      5. 在弹出的菜单中选择Generate ButterKnife Injections,此时会再次弹出一个对话框
      6. 新的对话框中点击confirm后直接生成控件的引用,代替findViewById
      7. 如果需要处理控件的点击事件,可以选择对应控件的OnClick复选框.
      8. 如果是ListView的Item视图,还可以选择左下角的Create ViewHolder复选框,生成ViewHolder静态类.
    • 常用注解:@Bind @OnClick

    • 配置自动添加依赖:

      • 在AndroidStudio\plugins\android\lib\templates\gradle-projects\NewAndroidModule\recipe.xml.ftl中添加如下代码,以后新创建的工程默认会添加Butterknife依赖:

        <dependency mavenUrl="com.jakewharton:butterknife:7.0.1"/>
        

    1.3依赖注入_AndroidAnnotations

    • 主页: http://androidannotations.org/
    • 用途:

      1. 使用依赖注入Views,resources,JavaBean,System Service
      2. 事件绑定
      3. 简化线程模型
      4. REST Client (简化网络请求)
    • 配置:

      1. 在project/build.gradle 文件中按下图所示添加代码:

            mavenCentral()
        
            classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
        
            mavenCentral()
            mavenLocal()
        

        logo

      2. 在app/build.gradle 文件中按下图所示添加代码:

            apply plugin: 'android-apt'
            apt {
                arguments {
                    androidManifestFile variant.outputs[0]?.processResources?.manifestFile
                }
            }
        
            apt "org.androidannotations:androidannotations:4.0.0"
            compile "org.androidannotations:androidannotations-api:4.0.0"
        

        logo

    • 常见注解:

      • @ViewById
      • @Click
      • @EActivity
      • @Fullscreen和@WindowFeature
      • @EBean和@Bean
      • @Backgroup @UIThread
    • 注意事项:

      • @ViewById需要在使用了@EActivity注解的activity中使用
      • 使用了@EActivity后Manifest中注册的activity要在原类名后追加”_”
      • 使用注解的控件和方法不能使用private修饰符
      • 大型项目并不适用

    1.4依赖注入_Dagger2

    • 主页: https://github.com/google/dagger

    • 历史:

    • 配置:

      1. 在project/build.gradle 文件中按下图所示添加代码:

        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
        

        icon

      2. 在app/build.gradle文件添加配置:

         apply plugin: 'com.neenbedankt.android-apt'
        
         compile 'com.google.dagger:dagger:2.2'
         apt 'com.google.dagger:dagger-compiler:2.2'
         provided 'org.glassfish:javax.annotation:10.0-b28'
        

      Logo

    • 主要的注解:

      • @Inject: 声明一个对象,表示该对象会由dagger框架注入实现初始化;

      • @Module: 声明一个类,该类会用Module作为后缀,表示该类可以创建各种依赖对象。该类中的方法会通过@Provides标注;

      • @Provides: 用来声明添加了@module的类中的方法,该方法会用provide作为前缀,表示该方法用来创建(初始化)一个对象,返回值就是我们通常要new出来的对象。

      • @Component: 用来声明一个接口,该接口以Component为后缀, 其作用是用来关联@Inject类和@Module类两部分;

      • @Component的实现类:@Component注解的接口,Dagger2将会为该接口生成一个实现类,这个实现的命名是在接口前面加上Dagger,如MyComponent生成的实现类是DaggerMyComponent

    • 使用步骤:

      1. 创建实体类User, MainActivity中通过@Inject注入user;
      2. 创建Module,并在其中创建Provides.示例代码:

        @Module
        public class MainActivityModule {
        
            @Provides
            User provideUser(){
                return  new User("zhangsan", 12, "18612345678");
            }
        }
        
      3. 创建Component.示例代码:

        @Component(modules = MainActivityModule.class)
        public interface MainActivityComponent {
            void inject(MainActivity activity);
        }
        
      4. Rebuild工程,生成对应的以Dagger开始的工具类

      5. 利用对应的以Dagger工具类初始化,并注入对象.示例代码:

        public class MainActivity extends AppCompatActivity {
            @Inject
            User user;
        
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
        
                MainActivityComponent component = DaggerMainActivityComponent.builder().mainActivityModuel(new MainActivityModule()).build();
                component.inject(this);
            }
        }
        

    网络

    使用网络库不要忘记添加网络权限

    2.1网络_Volley

    • 主页:https://android.googlesource.com/platform/frameworks/volley/

    • 特点:

      • 适配请求操作频繁且数据量小的应用场景
      • 支持网络请求的排序,优先级处理
      • 支持网络请求的缓存
      • 支持取消请求
      • 扩展性较强
    • 使用步骤:

      1. 创建RequestQueue
      2. 创建Request
      3. 添加Request到RequestQueue
    • 注意事项:

      • Volley内部用到了httpClient,编译时compileSdkVersion需要<=22,这是因为在Android6.0中Google移除了httpClient相关的API, 或者把httpclient库拷贝进来;
      • Volley仅适合用于通信频繁数据量小的网络操作
      • 大数据量的网络操作并不适合Volley
    • 工作原理图

      icon

    • 使用步骤:

      1. 创建RequestQueue
      2. 创建Request对象
      3. 添加Request对象到RequestQueue中

    2.2网络_Okhttp

    • 主页: https://github.com/square/okhttp
    • 配置: 添加依赖 compile ‘com.squareup.okhttp3:okhttp:3.2.0’
    • 特点:

      • 支持HTTP/2 和 SPDY
      • 默认支持 GZIP 降低传输内容的大小
      • 支持网络请求的缓存
      • 当网络出现问题时,自动重连;
    • 使用步骤:

      1. 创建OkHttpClient对象
      2. 创建Request对象
      3. 添加Request对象到OkHttpClient对象中并执行请求.示例代码:

            OkHttpClient client=new OkHttpClient();
            RequestBody body = new FormBody.Builder()
                    .add("phone", "13812345678")// 构造请求的参数
                    .add("key", "daf8fa858c330b22e342c882bcbac622")// 构造请求的参数
                    .build();
            Request post_request = new Request.Builder()
                    .url(URL_POST)// 指定请求的地址
                    .post(body)// 指定请求的方式为POST
                    .build();
            client.newCall(post_request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    // 请求失败的处理
                }
        
                @Override
                public void onResponse(Call call, Response response) throws IOException {   // 请求成功的处理
                    ResponseBody body = response.body();
                    String string = body.string();// 把返回的结果转换为String类型
                    // body.bytes();// 把返回的结果转换为byte数组
                    // body.byteStream();// 把返回的结果转换为流
                }
            });
        
    • 因为原生OkHttp的使用比较复杂,有一个包装过的工具项目okhttp-utils使用非常简单

    2.3网络_Retrofit

    • 主页: https://github.com/square/retrofit
    • http://square.github.io/retrofit/
      *
    • 注意: 使用Retrofit的前提是服务器端代码遵循REST规范 !!!!!
    • 功能:
      • 效率非常高
      • 可以直接将结果转换称Java类
      • 主要是配合RxJava一起使用
    • 配置:

      • 添加Retrofit依赖: compile ‘com.squareup.retrofit2:retrofit:2.0.2’
      • 添加数据解析依赖,根据实际情况进行选择
        • Gson : com.squareup.retrofit2:converter-gson:2.0.2
        • Jackson : com.squareup.retrofit2:converter-jackson:2.0.2
        • Moshi : com.squareup.retrofit2:converter-moshi:2.0.2
        • Protobuf : com.squareup.retrofit2:converter-protobuf:2.0.2
        • Wire : com.squareup.retrofit2:converter-wire:2.0.2
        • Simple XML : com.squareup.retrofit2:converter-simplexml:2.0.2
    • 使用步骤:

      1. 使用AndroidStudio gsonFormat插件创建数据模型
      2. 创建REST API 接口

        • 常用注解:

          • 请求方法:@GET / @POST / @PUT / @DELETE / @HEAD
          • URL处理

            • @Path - 替换参数

              @GET("/group/{id}/users")
              public Call<List<User>> groupList(@Path("id") int groupId);
              
            • @Query - 添加查询参数

              @GET("/group/{id}/users")
              public Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);
              
            • @QueryMap - 如果有多个查询参数,把它们放在Map中

              @GET("/group/{id}/users")
              public Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
              
        • 示例代码:

          public interface NetAPI {
              @GET("/users/{user}")
              public Call<GitModel> getFeed(@Path("user") String user);
          
              @GET("/service/getIpInfo.php")
              public Call<IPModel> getWeather(@Query("city")String city);
          }
          
      3. 创建Retrofit对象, 并发起请求.示例代码:

        // 构建Retrofit实例
        Retrofit retrofit = new Retrofit.Builder().
                baseUrl(API2).
                addConverterFactory(GsonConverterFactory.create()).
                build();
        
        // 构建接口的实现类
        IpAPI weatherAPI = retrofit.create(IpAPI.class);
        // 调用接口定义的方法
        Call<IPModel> weatherCall = weatherAPI.getWeather("8.8.8.8");
        // 异步执行请求
        weatherCall.enqueue(new Callback<IPModel>() {
            @Override
            public void onResponse(Call<IPModel> call, Response<IPModel> response) {
                IPModel model = response.body();
                System.out.println("country:" + model.getData().getCountry());
            }
        
            @Override
            public void onFailure(Call<IPModel> call, Throwable t) {
                System.out.println(t.toString());
            }
        });
        
    • 优点: Logo

    图像

    3.1图像_UIL

    • 主页: https://github.com/nostra13/Android-Universal-Image-Loader
    • 使用步骤:

      1. 添加依赖: compile ‘com.nostra13.universalimageloader:universal-image-loader:1.9.5’
      2. 添加权限:

        - 

        - 

      3. 在Application或Activity中进行初始化配置

        // ImageLoaderConfiguration 详细配置
        File cacheDir = StorageUtils.getOwnCacheDirectory(getApplicationContext(), "imageloader/Cache"); // 自定义缓存文件夹
        ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
             .memoryCacheExtraOptions(480, 800) // 指定缓存到内存时图片的大小,默认是屏幕尺寸的长宽
             .diskCacheExtraOptions(480, 800, null) // 指定缓存到硬盘时图片的大小,并不建议使用
             .taskExecutor(new Executor()) // 自定义一个线程来加载和显示图片
             .taskExecutorForCachedImages(new Executor())// 自定义一个线程来缓存图片
             .threadPoolSize(3) // default, 指定线程池大小
             .threadPriority(Thread.NORM_PRIORITY - 2) // default ,指定线程优先级 
             .tasksProcessingOrder(QueueProcessingType.FIFO) // default , 指定加载显示图片的任务队列的类型
             .denyCacheImageMultipleSizesInMemory() // 禁止在内存中缓存同一张图片的多个尺寸类型
             .memoryCache(new LruMemoryCache(2 * 1024 * 1024)) // 指定内存缓存的大小,默认值为1/8 应用的最大可用内存
             .memoryCacheSize(2 * 1024 * 1024) 
             .memoryCacheSizePercentage(13) // default
             .diskCache(new UnlimitedDiskCache(cacheDir)) // default , 指定硬盘缓存的地址
             .diskCacheSize(50 * 1024 * 1024) // 指定硬盘缓存的大小
             .diskCacheFileCount(100) // 指定硬盘缓存的文件个数
             .diskCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default , 指定硬盘缓存时文件名的生成器
             .imageDownloader(new BaseImageDownloader(context)) // default , 指定图片下载器
             .imageDecoder(new BaseImageDecoder()) // default , 指定图片解码器
             .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default , 指定图片显示的配置
             .writeDebugLogs() // 是否显示Log
             .build();
        
        // ImageLoaderConfiguration 简单初始化
        ImageLoaderConfiguration configuration = ImageLoaderConfiguration.createDefault(this);
        // 初始化配置
        ImageLoader.getInstance().init(configuration);  
        
      4. DisplayImageOptions 参数详解:

        DisplayImageOptions options = new DisplayImageOptions.Builder()
            .showImageOnLoading(R.drawable.ic_stub) // 图片正在加载时显示的图片资源ID
            .showImageForEmptyUri(R.drawable.ic_empty) // URI为空时显示的图片资源ID
            .showImageOnFail(R.drawable.ic_error) // 图片加载失败时显示的图片资源ID
            .resetViewBeforeLoading(false)  // default 图片在下载前是否重置,复位
            .delayBeforeLoading(1000) // 图片开始加载前的延时.默认是0
            .cacheInMemory(false) // default , 是否缓存在内存中, 默认不缓存
            .cacheOnDisk(false) // default , 是否缓存在硬盘 , 默认不缓存
            .preProcessor(new BitmapProcessor) // 设置图片缓存在内存前的图片处理器
            .postProcessor(new BitmapProcessor) // 设置图片在缓存到内存以后 , 显示在界面之前的图片处理器
            .extraForDownloader(...) // 为图片下载设置辅助参数
            .considerExifParams(false) // default , 设置是否考虑JPEG图片的EXIF参数信息,默认不考虑
            .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2) // default , 指定图片缩放的方式,ListView/GridView/Gallery推荐使用此默认值
            .bitmapConfig(Bitmap.Config.ARGB_8888) // default , 指定图片的质量,默认是 ARGB_8888
            .decodingOptions(...) // 指定图片的解码方式
            .displayer(new SimpleBitmapDisplayer()) // default , 设置图片显示的方式,用于自定义
            .handler(new Handler()) // default ,设置图片显示的方式和ImageLoadingListener的监听, 用于自定义
            .build();
        
      5. 显示图片的方法:

        ImageLoader.getInstance().loadImage(String uri, ImageLoadingListener listener)  
        
        displayImage(String uri, ImageView imageView)
        displayImage(String uri, ImageView imageView, DisplayImageOptions options)
        displayImage(String uri, ImageView imageView, DisplayImageOptions options,
                ImageLoadingListener listener, ImageLoadingProgressListener progressListener) 
        
      6. 特殊用法:

        1. 显示圆形图片.使用该效果,必须显式指定图片的宽高

          DisplayImageOptions options = new DisplayImageOptions.Builder()
                  .displayer(new CircleBitmapDisplayer())
                  .build();
          
        2. 显示圆角图片.使用该效果,必须显式指定图片的宽高

          DisplayImageOptions options = new DisplayImageOptions.Builder()
                  .displayer(new RoundedBitmapDisplayer(90))
                  .build();
          
        3. 显示渐显图片

          DisplayImageOptions options = new DisplayImageOptions.Builder()
                  .displayer(new FadeInBitmapDisplayer(3000))
                  .build();
          

    3.2图像_Fresco

    • 主页: https://github.com/facebook/fresco
    • 中文文档: http://fresco-cn.org/docs/index.html
    • 中文网站:http://www.fresco-cn.org/
    • 使用步骤

      1. 添加依赖: compile ‘com.facebook.fresco:fresco:0.9.0+’
      2. 添加权限

        <uses-permission android:name="android.permission.INTERNET"/>
        
      3. 在Application初始化或在Activity 的setContentView()方法之前,进行初始化

        Fresco.initialize(this);
        
      4. 在布局文件中添加图片控件.宽高必须显示指定,否则图片无法显示.

        <com.facebook.drawee.view.SimpleDraweeView
            android:id="@+id/my_image_view"
            android:layout_width="200dp"
            android:layout_height="200dp"
            fresco:placeholderImage="@mipmap/ic_launcher" />
        
      5. 在Java代码中指定图片的路径.显示图片.SimpleDraweeView接收的路径参数为URI,所以需要一次转换.

        Uri uri = Uri.parse(URL_IMG2);
        SimpleDraweeView view = (SimpleDraweeView) findViewById(R.id.my_image_view);
        view.setImageURI(uri);
        
      6. XML方式配置参数.除图片地址以外,其他所有显示选项都可以在布局文件中指定

        <com.facebook.drawee.view.SimpleDraweeView
            android:id="@+id/my_image_view"
            android:layout_width="20dp"
            android:layout_height="20dp"
            fresco:actualImageScaleType="focusCrop"// 图片的缩放方式.
            fresco:backgroundImage="@color/blue" //背景图.不支持缩放.XML仅能指定一张背景图.如果使用Java代码指定的话,可以指定多个背景,显示方式类似FrameLayout,多个背景图按照顺序一级一级层叠上去.
            fresco:fadeDuration="300" // 渐显图片的时间
            fresco:failureImage="@drawable/error" // 图片加载失败显示的图片
            fresco:failureImageScaleType="centerInside" //// 图片加载失败显示的图片的缩放类型
            fresco:overlayImage="@drawable/watermark" // 层叠图,最后叠加在图片之上.不支持缩放.XML仅能指定一张.如果使用Java代码指定的话,可以指定多个,显示方式类似FrameLayout,多个图按照顺序一级一级层叠上去.
            fresco:placeholderImage="@color/wait_color"  // 图片加载成功之前显示的占位图
            fresco:placeholderImageScaleType="fitCenter" // 图片加载成功之前显示的占位图的缩放类型
            fresco:pressedStateOverlayImage="@color/red" // 设置按压状态下的层叠图.不支持缩放.
            fresco:progressBarAutoRotateInterval="1000" // 进度条图片旋转显示时长
            fresco:progressBarImage="@drawable/progress_bar" // 进度条图片
            fresco:progressBarImageScaleType="centerInside" //进度条图片的缩放类型
            fresco:retryImage="@drawable/retrying" // 当图片加载失败的时候,显示该图片提示用户点击重新加载图片
            fresco:retryImageScaleType="centerCrop" // 提示图片的缩放类型
            fresco:roundAsCircle="false" // 显示圆形图片
            fresco:roundBottomLeft="false" // roundedCornerRadius属性设置后,四个角都会有圆角,如果左下角不需要设置为false.
            fresco:roundBottomRight="true" // roundedCornerRadius属性设置后,四个角都会有圆角,如果右下角不需要设置为false.
            fresco:roundTopLeft="true" // roundedCornerRadius属性设置后,四个角都会有圆角,如果左上角不需要设置为false.
            fresco:roundTopRight="false" // roundedCornerRadius属性设置后,四个角都会有圆角,如果右上角不需要设置为false.
            fresco:roundWithOverlayColor="@color/corner_color" // 设置图片圆角后空出区域的颜色.如示例图中的红色部分
            fresco:roundedCornerRadius="1dp" // 设置图片圆角角度,设置该属性后四个角都会生效
            fresco:roundingBorderColor="@color/border_color" // 设置圆角后,边框的颜色.
            fresco:roundingBorderWidth="2dp" /> // 设置圆角后,外边框的宽高
        

        Logo

      7. Java代码配置参数.

            GenericDraweeHierarchy hierarchy = GenericDraweeHierarchyBuilder
                    .newInstance(getResources())
                    .setRetryImage(getResources().getDrawable(R.mipmap.ic_launcher))
                    .build();
        
            imageivew.setHierarchy(hierarchy);
        
      8. 特殊用法:

        1. 显示渐进式JPEG图片

          ProgressiveJpegConfig pjpegConfig = new ProgressiveJpegConfig() {
              @Override
              // 返回下一个需要解码的扫描次数
              public int getNextScanNumberToDecode(int scanNumber) {
                  return scanNumber + 2;
              }
          
              // 确定多少个扫描次数之后的图片才能开始显示
              public QualityInfo getQualityInfo(int scanNumber) {
                  boolean isGoodEnough = (scanNumber >= 5);
                  return ImmutableQualityInfo.of(scanNumber, isGoodEnough, false);
              }
          };
          // ImagePipelineConfig配置如何加载图像
          ImagePipelineConfig config = ImagePipelineConfig.newBuilder(this)
                  .setProgressiveJpegConfig(pjpegConfig)
                  .build();
          
          img_uri = Uri.parse(URL_IMG2);
          //  显式地指定允许渐进式JPEG图片加载
          ImageRequest request = ImageRequestBuilder
                  .newBuilderWithSource(img_uri)
                  .setProgressiveRenderingEnabled(true)
                  .build();
          // 构建显示图片所用到的DraweeController
          DraweeController controller = Fresco.newDraweeControllerBuilder()
                  .setImageRequest(request)
                  .setOldController(simpleDraweeView.getController())
                  .build();
          
          simpleDraweeView.setController(controller);
          
        2. 显示GIF图片.Fresco 支持 GIF 和 WebP 格式的动画图片.如果你希望图片下载完之后自动播放,同时,当View从屏幕移除时,停止播放,只需要在 image request 中简单设置,示例代码:

          DraweeController controller = Fresco.newDraweeControllerBuilder()
                  .setUri(URL_GIF)
                  .setAutoPlayAnimations(true)
                  .build();
          simpleDraweeView.setController(controller);
          

    3.3图像_Picasso

    • 主页: https://github.com/square/picasso
    • 使用步骤

      1. 添加依赖 compile ‘com.squareup.picasso:picasso:2.5.2’
      2. 添加权限:

        <uses-permission android:name="android.permission.INTERNET"/>
        
      3. 加载图片,示例代码:

        Picasso
                .with(this)// 指定Context
                .load(URL_IMG3) //指定图片URL
                .placeholder(R.mipmap.ic_launcher) //指定图片未加载成功前显示的图片
                .error(R.mipmap.ic_launcher)// 指定图片加载失败显示的图片
                .resize(300, 300)// 指定图片的尺寸
                .fit()// 指定图片缩放类型为fit
                .centerCrop()// 指定图片缩放类型为centerCrop
                .centerInside()// 指定图片缩放类型为centerInside
                .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)// 指定内存缓存策略
                .priority(Picasso.Priority.HIGH)// 指定优先级
                .into(imageView); // 指定显示图片的ImageView
        
      4. 显示圆形图片.示例代码:

            // 自定义Transformation
            Transformation transform = new Transformation() {
                @Override
                public Bitmap transform(Bitmap source) {
                    int size = Math.min(source.getWidth(), source.getHeight());
                    int x = (source.getWidth() - size) / 2;
                    int y = (source.getHeight() - size) / 2;
                    Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size);
                    if (squaredBitmap != source) {
                        source.recycle();
                    }
                    Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig());
                    Canvas canvas = new Canvas(bitmap);
                    Paint paint = new Paint();
                    BitmapShader shader = new BitmapShader(squaredBitmap,
                            BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
                    paint.setShader(shader);
                    paint.setAntiAlias(true);
                    float r = size / 2f;
                    canvas.drawCircle(r, r, r, paint);
                    squaredBitmap.recycle();
                    return bitmap;
                }
        
                @Override
                public String key() {
                    return "circle";
                }
            };
            Picasso
                    .with(this)// 指定Context
                    .load(URL_IMG2) //指定图片URL
                    .transform(transform) // 指定图片转换器
                    .into(imageView); // 指定显示图片的ImageView
        
      5. 显示圆角图片

        class RoundedTransformation implements com.squareup.picasso.Transformation {
            private final int radius;
            private final int margin;  // dp
        
            // radius is corner radii in dp
            // margin is the board in dp
            public RoundedTransformation(final int radius, final int margin) {
                this.radius = radius;
                this.margin = margin;
            }
        
            @Override
            public Bitmap transform(final Bitmap source) {
                final Paint paint = new Paint();
                paint.setAntiAlias(true);
                paint.setShader(new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
        
                Bitmap output = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
                Canvas canvas = new Canvas(output);
                canvas.drawRoundRect(new RectF(margin, margin, source.getWidth() - margin, source.getHeight() - margin), radius, radius, paint);
        
                if (source != output) {
                    source.recycle();
                }
        
                return output;
            }
        
            @Override
            public String key() {
                return "rounded(radius=" + radius + ", margin=" + margin + ")";
            }
        }
        Picasso
                .with(this)// 指定Context
                .load(URL_IMG2) //指定图片URL
                .transform(new RoundedTransformation(360,0)) // 指定图片转换器
                .into(imageView); // 指定显示图片的ImageView
        

    3.4图像_Glide

    • 主页: https://github.com/bumptech/glide
    • 中文文档: http://mrfu.me/2016/02/27/Glide_Getting_Started/
    • 使用步骤

      1. 添加依赖 compile ‘com.github.bumptech.glide:glide:3.7.0’ , 同时还依赖于supportV4.如果没有请自行添加
      2. 添加权限:

        <uses-permission android:name="android.permission.INTERNET"/>
        
      3. 加载图片.示例代码:

        Glide
                .with(this) // 指定Context
                .load(URL_GIF)// 指定图片的URL
                .placeholder(R.mipmap.ic_launcher)// 指定图片未成功加载前显示的图片
                .error(R.mipmap.ic_launcher)// 指定图片加载失败显示的图片
                .override(300, 300)//指定图片的尺寸
                .fitCenter()//指定图片缩放类型为fitCenter
                .centerCrop()// 指定图片缩放类型为centerCrop
                .skipMemoryCache(true)// 跳过内存缓存
                .diskCacheStrategy(DiskCacheStrategy.NONE)//跳过磁盘缓存
                .diskCacheStrategy(DiskCacheStrategy.SOURCE)//仅仅只缓存原来的全分辨率的图像
                .diskCacheStrategy(DiskCacheStrategy.RESULT)//仅仅缓存最终的图像
                .diskCacheStrategy(DiskCacheStrategy.ALL)//缓存所有版本的图像
                .priority(Priority.HIGH)//指定优先级.Glide 将会用他们作为一个准则,并尽可能的处理这些请求,但是它不能保证所有的图片都会按照所要求的顺序加载。优先级排序:IMMEDIATE > HIGH > NORMAL > LOW
                .into(imageView);//指定显示图片的ImageView
        
      4. 显示圆形图片

        class GlideCircleTransform extends BitmapTransformation {
            public GlideCircleTransform(Context context) {
                super(context);
            }
        
            @Override
            protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
                return circleCrop(pool, toTransform);
            }
        
            private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
                if (source == null) return null;
        
                int size = Math.min(source.getWidth(), source.getHeight());
                int x = (source.getWidth() - size) / 2;
                int y = (source.getHeight() - size) / 2;
        
                // TODO this could be acquired from the pool too
                Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
        
                Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
                if (result == null) {
                    result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
                }
        
                Canvas canvas = new Canvas(result);
                Paint paint = new Paint();
                paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
                paint.setAntiAlias(true);
                float r = size / 2f;
                canvas.drawCircle(r, r, r, paint);
                return result;
            }
        
            @Override
            public String getId() {
                return getClass().getName();
            }
        }
        
        Glide
                .with(this) // 指定Context
                .load(URL_GIF)// 指定图片的URL
                .transform(new GlideCircleTransform(this)) // 指定自定义BitmapTransformation
                .into(imageView);//指定显示图片的ImageView
        
      5. 显示圆角图片

        class GlideRoundTransform extends BitmapTransformation {
        
            private static float radius = 0f;
        
            public GlideRoundTransform(Context context) {
                this(context, 4);
            }
        
            public GlideRoundTransform(Context context, int dp) {
                super(context);
                this.radius = Resources.getSystem().getDisplayMetrics().density * dp;
            }
        
            @Override protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
                return roundCrop(pool, toTransform);
            }
        
            private static Bitmap roundCrop(BitmapPool pool, Bitmap source) {
                if (source == null) return null;
        
                Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
                if (result == null) {
                    result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
                }
        
                Canvas canvas = new Canvas(result);
                Paint paint = new Paint();
                paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
                paint.setAntiAlias(true);
                RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());
                canvas.drawRoundRect(rectF, radius, radius, paint);
                return result;
            }
        
            @Override public String getId() {
                return getClass().getName() + Math.round(radius);
            }
        }
        
        Glide
                .with(this) // 指定Context
                .load(URL_GIF)// 指定图片的URL
                .transform(new GlideRoundTransform(this,30)) // 指定自定义BitmapTransformation
                .into(imageView);//指定显示图片的ImageView
        
      6. 更改Glide默认配置的步骤:

        1. 创建一个GlideModule的实现类,并在其中更改自己需要的设置.示例代码:

          public class SimpleGlideModule implements GlideModule {
              @Override
              public void applyOptions(Context context, GlideBuilder builder) {
                  // 更改Bitmap图片压缩质量为8888,默认为565
                  builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
              }
          
              @Override
              public void registerComponents(Context context, Glide glide) {
                  // todo
              }
          }
          
        2. 在manifet/Application中添加一个meta-data节点.name值为刚刚创建的GlideModule实现类的完整包名+类名,value值为GlideModule.示例代码:

          <meta-data
              android:name="com.alpha.glidedemo.SimpleGlideModule"
              android:value="GlideModule" />
          
        3. 之后Glide加载图片的时候将会按照新的设置加载.

    图像库对比

    • 快速加载图片推荐Glide
    • 对图片质量要求较高推荐Picasso
    • 如果应用加载的图片很多,推荐Fresco > Glide > Picasso

    Logo

    数据库

    4.1数据库_ormlite

    • 主页: http://ormlite.com/
    • 配置: 添加以下依赖
      • compile ‘com.j256.ormlite:ormlite-android:4.48’
      • compile ‘com.j256.ormlite:ormlite-core:4.48’
    • 用途: 操作数据库
    • 使用步骤

      1. 创建数据库表结构的实体类.示例代码:

        @DatabaseTable(tableName = "user")
        public class User {
            @DatabaseField(generatedId = true)
            private int id;
            @DatabaseField(columnName = "name")
            private String name;
            @DatabaseField(columnName = "age")
            private int age;
            @DatabaseField(columnName = "tel")
            private String tel;
            public User() {
            }
            public User(String name, int age, String tel) {
                this.name = name;
                this.age = age;
                this.tel = tel;
            }
        }
        
      2. 创建OrmLiteSqliteOpenHelper的实现类.示例代码:

        public class UserDBOpenHelper extends OrmLiteSqliteOpenHelper {
            public UserDBOpenHelper(Context context) {
                super(context, "user.db", null, 1);
            }
            @Override
            public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
                try {
                    // 创建表
                    TableUtils.createTable(connectionSource, User.class);
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
                try {
                    // 更新表
                    TableUtils.dropTable(connectionSource, User.class, true);
                    onCreate(database, connectionSource);
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            private static UserDBOpenHelper instance;
        
            public static synchronized UserDBOpenHelper getInstance(Context context) {
                if (instance == null) {
                    synchronized (UserDBOpenHelper.class) {
                        if (instance == null) {
                            instance = new UserDBOpenHelper(context);
                        }
                    }
                }
                return instance;
            }
        
            private Dao<User, Integer> dao;
            // 获取操作数据库的DAO
            public Dao<User, Integer> getUserDao() throws SQLException {
                if (dao == null) {
                    dao = getDao(User.class);
                }
                return dao;
            }
        
            @Override
            public void close() {
                super.close();
                dao = null;
            }
        }
        
      3. 获取数据库的DAO对象, 即可进行增删改查的操作.示例代码:

        UserDBOpenHelper helper = new UserDBOpenHelper(this);
        Dao<User, Integer> dao =  helper.getUserDao();
        User user = new User("zhangsan", 12, "13212345678");
        // 增
        dao.create(user);
        // 改
        dao.updateRaw("update user set tel = '18882348888' where name = ?", new String[]{"王武"});
        // 查
        List<User> query = dao.queryForEq("name", "王武");
        // 删
        dao.deleteById(2);
        

    4.2数据库_greenDAO

    • 主页: https://github.com/greenrobot/greenDAO
    • 配置: 添加以下依赖
      • compile ‘de.greenrobot:greendao:2.1.0’
      • compile ‘de.greenrobot:greendao-generator:2.1.0’
    • 用途: 操作数据库
    • 优点:
      • Logo
      • 性能最大化,内存开销最小化
      • 易于使用的API
      • 为Android进行高度优化
    • 使用步骤

      1. 创建自定义的DAOGenerater,指定数据库相关配置并生成相关类

        public class CustomDAOGenerater {
            public static void main(String[] args) throws Exception {
                // 第一个参数为数据库版本
                //第二个参数为数据库的包名
                Schema schema = new Schema(1, "com.alpha.db");
                // 创建表,参数为表名
                Entity entity = schema.addEntity("Info");
                // 为表添加字段
                entity.addIdProperty();// 该字段为id
                entity.addStringProperty("name");// String类型字段
                entity.addIntProperty("age");//Int类型字段
                entity.addStringProperty("tel");// String类型字段
        
                // 生成数据库相关类
                //第二个参数指定生成文件的本次存储路径,AndroidStudio工程指定到当前工程的java路径
                new DaoGenerator().generateAll(schema, "C:\\Users\\Alpha\\AndroidStudioProjects\\GreenDaoDemo\\app\\src\\main\\java");
            }
        }
        
      2. 在Application中通过DaoMaster.DevOpenHelper初始化数据库

        // 该初始化过程最好放在Application中进行,避免创建多个Session
        private void setupDatabase() {
            // 通过 DaoMaster 的内部类 DevOpenHelper创建数据库
            // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表
            // 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
            /**
             * @param context : Context
             * @param name : 数据库名字
             * @param factory : CursorFactroy
             */
            DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "student.db", null);
            // 获取数据库
            SQLiteDatabase database = helper.getWritableDatabase();
            // 获取DaoMaster
            DaoMaster daoMaster = new DaoMaster(database);
            // 获取Session
            DaoSession daoSession = daoMaster.newSession();
            // 获取对应的表的DAO对象
            InfoDao dao = daoSession.getInfoDao();
        }
        
      3. 获取数据库的DAO对象,即可进行增删改查的操作

        // 增
        dao.insert(new Info(null, "zhangsan", 12, "13112345678"));
        // 删
        dao.deleteByKey(1L);
        // 改
        Info info = new Info(3L, "赵琦", 78, "18812348888");
        dao.update(info);
        // 查
        QueryBuilder<Info> builder = dao.queryBuilder();
        builder.where(InfoDao.Properties.Name.eq("lisi"));
        Query<Info> build = builder.build();
        List<Info> list = build.list();
        

    4.3数据库_Litepal

    响应式函数编程Rx(Reactive Extensions)

    5.1响应式函数编程_RxJava & RxAndroid

    • 主页: https://github.com/ReactiveX/RxJava
    • 中文资料:
    • 用途:
      • 异步操作
      • 在程序逻辑异常复杂的情况下,仍然可以让代码的逻辑保持简洁
    • 配置: 添加依赖:

      • compile ‘io.reactivex:rxjava:1.1.3’
      • compile ‘io.reactivex:rxandroid:1.1.0’
      • 如果结合Retrofit使用,需要添加以下依赖
      • compile ‘com.squareup.retrofit2:retrofit:2.0.1’
      • compile ‘com.squareup.retrofit2:converter-gson:2.0.1’
      • compile ‘com.squareup.retrofit2:adapter-rxjava:2.0.1’
    • 基本概念:

      1. 被观察者: Observable
        • 作用: 决定什么时候触发事件以及触发怎样的事件
        • 创建方法:
          • Observable.just(T…) 参数为单个的
          • Observable.from(T[]) / Observable.from(Iterable

    第三方分享

    6.1第三方分享_Mob

    • 主页: http://www.mob.com/
    • 用途:第三方分享
    • 使用步骤

      1. 访问http://dashboard.mob.com/#/share/index注册应用获取AppKey
      2. 访问http://www.mob.com/#/downloadDetail/ShareSDK/android下载SDK
      3. 解压下载回来的SDK,打开ShareSDK for Android中的QuickIntegrater.jar,填入应用的名称和包名,让工具生成相关的资源文件.并拷贝到工程当中
        Logo
      4. 配置权限

        <uses-permission android:name="android.permission.GET_TASKS" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
        <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
        <!-- 蓝牙分享所需的权限 -->
        <uses-permission android:name="android.permission.BLUETOOTH" />
        <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
        
      5. 添加Activity信息

        <activity
             android:name="com.mob.tools.MobUIShell"
             android:theme="@android:style/Theme.Translucent.NoTitleBar"
             android:configChanges="keyboardHidden|orientation|screenSize"
             android:screenOrientation="portrait"
             android:windowSoftInputMode="stateHidden|adjustResize" >
        
             <intent-filter>
                <!-- tencent后面的appid要保持和您配置的QQ的appid一致 -->
                 <data android:scheme="tencent100371282" />
                 <action android:name="android.intent.action.VIEW" />
                 <category android:name="android.intent.category.BROWSABLE" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
        
            <!-- 调用新浪原生SDK,需要注册的回调activity -->
            <intent-filter>
                <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        
      6. 如果您集成了微信,易信,新浪微博支付宝还需要添加下面回调的activity处理

            <!--微信分享回调 -->
             <activity
                 android:name=".wxapi.WXEntryActivity"
                 android:theme="@android:style/Theme.Translucent.NoTitleBar"
                 android:configChanges="keyboardHidden|orientation|screenSize"
                 android:exported="true"
                 android:screenOrientation="portrait" /> 
        
            <!--易信分享回调 -->
             <activity
                 android:name=".yxapi.YXEntryActivity"
                 android:theme="@android:style/Theme.Translucent.NoTitleBar"
                 android:configChanges="keyboardHidden|orientation|screenSize"
                 android:exported="true"
                 android:screenOrientation="portrait" />
        
             <!-- 支付宝分享回调 -->
            <activity
                android:name=".apshare.ShareEntryActivity"
                android:theme="@android:style/Theme.Translucent.NoTitleBar"
                android:configChanges="keyboardHidden|orientation|screenSize"
                android:exported="true"/>
        
      7. 更改assets/ShareSDK中的配置信息.根据自己的实际情况更改每一个平台的信息

      8. 分享.示例代码:

        private void showShare() {
         ShareSDK.initSDK(this);
         OnekeyShare oks = new OnekeyShare();
         //关闭sso授权
         oks.disableSSOWhenAuthorize(); 
        
        // 分享时Notification的图标和文字  2.5.9以后的版本不调用此方法
         //oks.setNotification(R.drawable.ic_launcher, getString(R.string.app_name));
         // title标题,印象笔记、邮箱、信息、微信、人人网和QQ空间使用
         oks.setTitle(getString(R.string.share));
         // titleUrl是标题的网络链接,仅在人人网和QQ空间使用
         oks.setTitleUrl("http://sharesdk.cn");
         // text是分享文本,所有平台都需要这个字段
         oks.setText("我是分享文本");
         // imagePath是图片的本地路径,Linked-In以外的平台都支持此参数
         //oks.setImagePath("/sdcard/test.jpg");//确保SDcard下面存在此张图片
         // url仅在微信(包括好友和朋友圈)中使用
         oks.setUrl("http://sharesdk.cn");
         // comment是我对这条分享的评论,仅在人人网和QQ空间使用
         oks.setComment("我是测试评论文本");
         // site是分享此内容的网站名称,仅在QQ空间使用
         oks.setSite(getString(R.string.app_name));
         // siteUrl是分享此内容的网站地址,仅在QQ空间使用
         oks.setSiteUrl("http://sharesdk.cn");
        
         // 启动分享GUI
         oks.show(this);
         }
        

    6.2第三方分享_友盟

    数据统计

    7.1数据统计_百度统计

    • 主页: http://mtj.baidu.com/web/sdk/index
    • 开发文档: http://developer.baidu.com/wiki/index.php?title=%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3%E9%A6%96%E9%A1%B5/%E7%99%BE%E5%BA%A6%E7%A7%BB%E5%8A%A8%E7%BB%9F%E8%AE%A1API/%E7%99%BE%E5%BA%A6%E7%A7%BB%E5%8A%A8%E7%BB%9F%E8%AE%A1_Android%E7%89%88SDK
    • 配置: 将下载回来的jar放在libs目录.并添加到依赖中
    • 用途:
      • 分析流量来源: 渠道流量对比、细分渠道分析,准确监控不同推广位数据,实时获知渠道贡献。
      • 分析用户:基于百度的海量数据积累,多维度分析并呈现用户画像信息。
      • 分析终端:设备分布一目了然(设备型号、品牌、操作系统、分辨率、联网方式、运营商等)。
    • 使用步骤

      1. 登录http://mtj.baidu.com/web/dashboard注册应用并获取appkey
      2. 在manifest文件中添加权限

        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.WRITE_SETTINGS" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.GET_TASKS" />
        <uses-permission android:name="android.permission.BLUETOOTH" />
        <!--(蓝牙为手表统计必填)-->
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <!--(3.7.1 新增)-->
        <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
        <!--可选的权限-->
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
        
      3. 在manifest文件的application节点添加相应的参数.根据实际业务需求选择

        <!--您从百度网站获取的 APP  KEY-->
        <meta-data
            android:name="BaiduMobAd_STAT_ID"
            android:value="08fbd2c8ce" />
        <!--渠道商编号,根据实际情况自行填写-->
        <meta-data
            android:name="BaiduMobAd_CHANNEL"
            android:value="Baidu Market" />
        <!--是否开启错误日志统计,默认为 false-->
        <meta-data
            android:name="BaiduMobAd_EXCEPTION_LOG"
            android:value="false" />
        <!--日志发送策略, 可选值: APP_START、 ONCE_A_DAY、 SET_TIME_INTERVAL,
        默认为 APP_START-->
        <meta-data
            android:name="BaiduMobAd_SEND_STRATEGY"
            android:value="APP_START" />
        <!--日志发送策略  为 SET_TIME_INTERVAL 时,需设定时间间隔.取值为 1-­‐24 的整数,默认为 1,单位为小时-->
        <meta-data
            android:name="BaiduMobAd_TIME_INTERVAL"
            android:value="1" />
        <!--日志仅在 wifi 网络下发送,默认为 false-->
        <meta-data
            android:name="BaiduMobAd_ONLY_WIFI"
            android:value="false" />
        <!--是否获取基站位置信息  ,默认为 true-->
        <meta-data
            android:name="BaiduMobAd_CELL_LOCATION"
            android:value="true" />
        <!--是否获取 GPS 位置信息,默认为 true-->
        <meta-data
            android:name="BaiduMobAd_GPS_LOCATION"
            android:value="true" />
        <!--是否获取 WIFI 位置信息,默认为 true-->
        <meta-data
            android:name="BaiduMobAd_WIFI_LOCATION"
            android:value="true" />
        
      4. 在所有的Activity的onResume()和onPause()方法中调用StatService.onResume(Context context) 和StatService.onPause (Context context)方法.所以最好创建一个BaseActiviy,并在其中实现这两个方法.出入的参数必须为this,不能是全局的Application Context.

      5. Fragment也是同理.在onResume()和onPause()方法中调用StatService.onResume(Context context) 和StatService.onPause (Context context)方法 6.

    消息推送

    8.1消息推送

    个推

    • 主页: http://www.getui.com/
    • 开发文档: http://docs.getui.com/pages/viewpage.action?pageId=589890
    • 使用步骤:

      1. 访问https://dev.getui.com/dos4.0/index.html#login注册应用
      2. 下载SDK并解压:http://docs.getui.com/mobile/android/overview/
      3. 将SDK解压后的资源文件中的GetuiSDK2.9.0.0.jar拷贝到项目中的libs,并添加到依赖

        • 因为Android Studio工程默认已经添加了supportV7的依赖,如果没有,请添加supportV4的依赖,否则会有异常
      4. 在\app\src\main目录中新建文件夹jniLibs(一个字都不能错!!L是大写的),然后把对应的so文件添加进去

      5. 将SDK解压后的资源文件中的layout文件拷贝到项目的layout文件夹

      6. 为了修改通知栏提示图标,请在res/drawable-hdpi/、res/drawable-mdpi/、res/drawable-ldpi/等各分辨率资源目录下,放置相应尺寸的push.png图片。可将SDK解压后的Demo工程中的push图片拷贝进来
      7. 添加权限. 注意替换包名

        <!-- 解决Android L上通知显示异常问题,targetSdkVersion需要设置成22 -->
        <uses-sdk
            android:minSdkVersion="9"
            android:targetSdkVersion="22" />
        <!-- 个推SDK权限配置开始 -->
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.WAKE_LOCK" />
        <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.VIBRATE" />
        <uses-permission android:name="android.permission.GET_TASKS" />
        <!-- ibeancon 需要蓝牙权限 -->
        <uses-permission android:name="android.permission.BLUETOOTH"/>  
        <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
        <!-- 支持个推3.0 电子围栏功能 -->
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <!-- 浮动通知权限 -->
        <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
        <!-- 自定义权限 -->  
        <uses-permission android:name="getui.permission.GetuiService.你的包名" /><!--替换为第三方应用的包名-->
        <permission
            android:name="getui.permission.GetuiService.你的包名"
            android:protectionLevel="normal" >
        </permission><!--替换为第三方应用的包名-->
        <!-- 个推SDK权限配置结束 -->
        
      8. 在manifest/Application节点添加以下信息.注意替换内容

        <!--个推SDK配置开始-->
            <!-- 配置的第三方参数属性 -->
            <meta-data
                android:name="PUSH_APPID"
                android:value="你的APPID" /><!--替换为第三方应用的APPID-->
            <meta-data
                android:name="PUSH_APPKEY"
                android:value="你的APPKEY" /><!--替换为第三方应用的APPKEY-->
            <meta-data
                android:name="PUSH_APPSECRET"
                android:value="你的APPSECRET" /><!--替换为第三方应用的APPSECRET-->
            <!-- 配置SDK核心服务 -->
            <service
                android:name="com.igexin.sdk.PushService"
                android:exported="true"
                android:label="NotificationCenter"
                android:process=":pushservice" />
            <service
                android:name="com.igexin.sdk.PushServiceUser"
                android:exported="true"
                android:label="NotificationCenterUser" />
            <receiver android:name="com.igexin.sdk.PushReceiver" >
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                    <action android:name="android.intent.action.USER_PRESENT" />
                    <action android:name="com.igexin.sdk.action.refreshls" />
                    <!-- 以下三项为可选的action声明,可大大提高service存活率和消息到达速度 -->
                    <action android:name="android.intent.action.MEDIA_MOUNTED" />
                    <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
                    <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
                </intent-filter>
            </receiver>
        
            <receiver
                android:name="com.igexin.sdk.PushManagerReceiver"
                android:exported="false" >
                <intent-filter>
                    <action android:name="com.igexin.sdk.action.pushmanager" />
                </intent-filter>
            </receiver>             
        
        <!-- 个推SDK配置结束 -->
        
      9. 在Activity中初始化SDK

        PushManager.getInstance().initialize( this.getApplicationContext() );
        

        * 该方法必须在Activity或Service类内调用,一般情况下,可以在Activity的onCreate()方法中调用。由于应用每启动一个新的进程,就会调用一次Application的onCreate()方法,而个推SDK是一个独立的进程,因此如果在Application的onCreate()中调用intialize接口,会导致SDK初始化在一个应用中多次调用,所以不建议在Application继承类中调用个推SDK初始化接口。

      10. 在手机或模拟器上运行您的工程,查看Android Monitor信息,如图所示。在搜索框中输入“clientid”可以看到“clientid is xxx”,则意味则初始化SDK成功,并获取到相应的cid信息,恭喜你:-D,可以开始进行推送测试了。如图所示:
        Logo

      11. 接收透传消息

        <!-- 在配置文件中配置第三方Receiver -->
        <receiver
            <!-- 此处com.getui.demo.PushDemoReceiver,需要替换成开发者自己的BroadcastReceiver -->
            android:name="com.getui.demo.PushDemoReceiver"
            android:exported="false">
            <intent-filter>
            <action android:name="com.igexin.sdk.action.你的APP_ID" />
            </intent-filter>
        </receiver>
        
        定义广播接收者:
        public class PushDemoReceiver extends BroadcastReceiver {
        
            @Override
            public void onReceive(Context context, Intent intent) {
                Bundle bundle = intent.getExtras();
        
                switch (bundle.getInt(PushConsts.CMD_ACTION)) {
                    case PushConsts.GET_MSG_DATA:
                        // 获取透传数据
                        byte[] payload = bundle.getByteArray("payload");
                        if (payload != null) {
                            String data = new String(payload);
                            Log.d("GetuiSdkDemo", "------------receiver payload : " + data);
                        }
                        break;
                }
            }
        }
        

    友盟

    百度云推送

    极光推送

    Bug追踪

    9.1Bug追踪_Bugly

    • 主页: http://bugly.qq.com/
    • 功能:
      • 及时掌握App崩溃信息
      • 支持Android NDK 开发C/C++类型的异常上报
    • 使用步骤

      1. 通过http://bugly.qq.com/apps注册应用
      2. 在module/build.gradle添加依赖

        android {
            defaultConfig {
                ndk {
                    // 设置支持的SO库架构
                    abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_6
                    4', 'arm64-v8a'
                }
            }
        }
        dependencies {
            compile 'com.tencent.bugly:crashreport:latest.release' 
        }
        
      3. 在gradle.properties文件中添加:

        android.useDeprecatedNdk=true
        
      4. 添加权限

        <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.READ_LOGS" />
        
      5. 在manifet文件的application节点配置相关参数

        <application
        <!-- 配置APP ID -->
        <meta-data
        android:name="BUGLY_APPID"
        android:value="<APP ID>" />
        <!-- 配置APP版本号 -->
        <meta-data
        android:name="BUGLY_APP_VERSION"
        android:value="<APP Version>" />
        <!-- 配置APP渠道号 -->
        <meta-data
        android:name="BUGLY_APP_CHANNEL"
        android:value="<APP Channel>" />
        <!-- 配置Bugly调试模式(true或者false)-->
        <meta-data
        android:name="BUGLY_ENABLE_DEBUG"
        android:value="<isDebug>" />
        </application>
        
      6. 在Application中初始化Bugly

        CrashReport.initCrashReport(getApplicationContext());
        

    BugTags

    Testin

    开源项目收集站

    展开全文
  • 本项目主要对目前 GitHub 上排名前 100 的 Android 开源库进行简单的介绍, 至于排名完全是根据GitHub搜索Java语言选择 (Best Match) 得到的结果, 然后过滤了跟Android不相关的项目, 所以排名并不具备任何官方效力, ...
  • 经常使用目前互联网比较流行的前端框架,小编根据自己工作中、关注中的一些前端框架进行了梳理,对于现在的开发者来说,都向着全栈方向发展,所以必须掌握些前端比较流行的框架,这样才能增强自己的技术体系框架,也...
  • web开源框架大汇总

    2016-04-19 22:46:27
    Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。由于Struts能充分满足应用开发的需求,简单易用,敏捷迅速,在过去的一年中颇受关注。Struts把Servlet、JSP、自定义标签和信息资源...
  • 2018优秀的开源框架

    2018-06-16 18:53:28
    程序员界有个神奇的网站,那就是github,这个网站集合了一大批优秀的开源框架,极大地节省了开发者开发的时间,在这里我进行了一下整理,这样可以使我们在使用到时快速的查找到,希望对大家有所帮助!1. Retrofit ...
  • 主要基于对现阶段一些常用的大数据开源框架技术的整理,只是一些简单的介绍,并不是详细技术梳理。可能会有疏漏,发现再整理。参考的太多,就不一一列出来了。这只是作为一个梳理,对以后选型或者扩展的做个参考。 ...
  • Android酷炫实用的开源框架(UI框架)前言忙碌的工作终于可以停息一段时间了,最近突然有一个想法,就是自己写一个app,所以找了一些合适开源控件,这样更加省时,再此分享给大家,希望能对大家有帮助,此博文介绍的...
  • 特别说明:这是我目前在接触过和使用过的,自认为是最好用的一个小程序开源框架库。小程序到底有多火,看看目前推出的开源框架以及组件库就知道了。由于小程序开发的火爆,大家都在致力于探索如何更好的,更加高效的...
  • 好久没写博文了,最近工作比较忙,剩下的一点点时间在做自己的项目,在Android酷炫实用的开源框架(UI框架)这篇文章中提到了很多开源的UI框架,我在自己的项目开发中也使用了大部分的,但是总觉得仅仅这几个不够用...
  • 一些开源框架的使用

    2016-08-29 14:04:25
    我们字需要会使用开源框架,而不知道它的实现过程,所以我们在知道框架大概实现的情况下,学会去利用框架,这才是上策,而不是只知道生搬硬套,这样技术就不会有很大的提升(注:这篇文章不定期更新
  • Java图片处理开源框架

    2013-12-27 17:56:00
    图片处理是当今软件开发中非常重要的一环,然而处理图片的开源框架却并不多。现金网上流传的Java处理图片的代码,虽然可对图片进行简单处理,但效果并不理想。虽然也有些其他解决方案,但都摆脱不了繁琐,使用起来...
  • 【回复“1024”,送你一个特别推送】特别说明:这是我目前在接触过和使用过的,自认为是最好用的一个小程序开源框架库。小程序到底有多火,看看目前推出的开源框架以及组件库就知...
  • Android开源框架系列 Android开源项目 Android开发常用开源框架2 Android开发常用开源框架3 GitHub上最火的Android开源项目,所有开源项目都有详细资料和配套视频 2017年伊始,你需要尝试的25...
  • 今天给大家带来了12个在GitHub等开源网站中最受欢迎的Python开源框架。如果你正在学习python,那么这12个开源框架,千万别错过,这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等。虽说不上是全都...
  • 此类框架往往是由多种开源框架堆砌而成的,若想一个个攻破对于新手来说是较为困难的一件事。就我个人经验而言,掌握一个框架的最快最好的方法其实还是项目驱动。从学习一样新事物的角度上来说,多种方法中的...
1 2 3 4 5 ... 20
收藏数 483,793
精华内容 193,517
关键字:

开源框架