Android之初识Glide

Glide简介:
     Glide 是 Google 员工的开源项目, Google I/O 上被推荐使用,一个高效、开源、Android设备上的媒体管理框架,它遵循BSD、MIT以及Apache 2.0协议发布。Glide具有获取、解码和展示视频剧照、图片、动画等功能,它还有灵活的API,这些API使开发者能够将Glide应用在几乎任何网络协议栈里。创建Glide的主要目的有两个,一个是实现平滑的图片列表滚动效果,另一个是支持远程图片的获取、大小调整和展示。

gitHub地址:https://github.com/bumptech/glide

Glide特点

  • 使用简单
  • 可配置度高,自适应程度高
  • 支持常见图片格式Jpg png gif webp
  • 支持多种数据源网络、本地、资源、Assets 等
  • 高效缓存策略支持Memory和Disk图片缓存
  • 默认Bitmap格式采用RGB_565内存使用至少减少一半
  • 生命周期集成根据Activity/Fragment生命周期自动管理请求
  • 高效处理Bitmap使用Bitmap Pool使Bitmap复用,主动调用recycle回收需要回收的Bitmap,减小系统回收压力

Glide简单使用

  1. 添加引用 build.gradle 中添加配置

    compile ‘com.github.bumptech.glide:glide:3.7.0’

  2. 设置绑定生命周期
    我们可以更加高效的使用Glide提供的方式进行绑定,这样可以更好的让加载图片的请求的生命周期动态管理起来

    Glide.with(Context context);// 绑定Context
    Glide.with(Activity activity);// 绑定Activity
    Glide.with(FragmentActivity activity);// 绑定FragmentActivity
    Glide.with(Fragment fragment);// 绑定Fragment

  3. 简单的加载图片实例

    Glide.with(this).load(imageUrl).into(imageView);

  4. 设置加载中以及加载失败图片
    api里面对placeholder()、error()函数中有多态实现 用的时候可以具体的熟悉一下

    Glide.with(this).load(imageUrl).placeholder(R.mipmap.ic_launcher).error(R.mipmap.ic_launcher).into(imageView);

  5. 设置跳过内存缓存

    Glide.with(this).load(imageUrl).into(imageView);

  6. 设置下载优先级

    Glide.with(this).load(imageUrl).priority(Priority.NORMAL).into(imageView);

  7. 设置缓存策略

    Glide.with(this).load(imageUrl).diskCacheStrategy(DiskCacheStrategy.ALL).into(imageView);

    策略解说:
    all:缓存源资源和转换后的资源
    none:不作任何磁盘缓存
    source:缓存源资源
    result:缓存转换后的资源

  8. 设置加载动画
    api也提供了几个常用的动画:比如crossFade()

    Glide.with(this).load(imageUrl).animate(R.anim.item_alpha_in).into(imageView);

    R.anim.item_alpha_in

    < ? xml version=”1.0” encoding=”utf-8”?>
    < set xmlns:android=”http://schemas.android.com/apk/res/android">
      < alpha
         android:duration=”500”
         android:fromAlpha=”0.0”
         android:toAlpha=”1.0”/>
    </ set>

  9. 设置缩略图支持
    这样会先加载缩略图 然后在加载全图

    Glide.with(this).load(imageUrl).thumbnail(0.1f).into(imageView);

  10. 设置加载尺寸

    Glide.with(this).load(imageUrl).override(800, 800).into(imageView);

  11. 设置动态转换

    Glide.with(this).load(imageUrl).centerCrop().into(imageView);

    api提供了比如:centerCrop()、fitCenter()等函数也可以通过自定义Transformation,举例说明:比如一个人圆角转化器

    public class GlideRoundTransform extends BitmapTransformation{
    private 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 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());
      return result;

    }

    @Override
    public String getId() {

    return getClass().getName() + Math.round(radius);

      }
    }

    Glide.with(this).load(imageUrl).transform(new GlideRoundTransform(this)).into(imageView);

  12. 设置要加载的内容

    项目中有很多需要先下载图片然后再做一些合成的功能,比如项目中出现的图文混排,该如何实现目标下

    Glide.with(this).load(imageUrl).centerCrop().into(new SimpleTarget() {
      @Override
      public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {

      imageView.setImageDrawable(resource);   

      }   
    });
    Glide.with(this).load(imageUrl).transform(new GlideRoundTransform(this)).into(imageView);

  13. 设置监听请求接口

    Glide.with(this).load(imageUrl).listener(new RequestListener() {
      @Override
      public boolean onException(Exception e, String model, Target target, boolean isFirstResource) {
         return false;
      }
      @Override
      public boolean onResourceReady(GlideDrawable resource, String model, Target target, boolean isFromMemoryCache, boolean isFirstResource) {

      //imageView.setImageDrawable(resource);

       return false;

      }}).into(imageView);

设置监听的用处 可以用于监控请求发生错误来源,以及图片来源 是内存还是磁盘

14.设置动态GIF加载方式

  Glide.with(this).load(imageUrl).asBitmap().into(imageView);//显示gif静态图片
  Glide.with(this).load(imageUrl).asGif().into(imageView);//显示gif动态图片

15.缓存的动态清理

  Glide.get(this).clearDiskCache();//清理磁盘缓存 需要在子线程中执行
  Glide.get(this).clearMemory();//清理内存缓存 可以在UI主线程中进行

前段UI框架

十个前段UI优秀框架

Bootstrap

首先说 Bootstrap,估计你也猜到会先说或者一定会有这个( 呵呵了 ),这是说明它的强大之处,拥有框架一壁江山的势气。自己刚入道的时候本着代码任何一个字母都得自己敲出来挡我者废的决心,来让自己成长。结果受到周围各种基友的引诱开始了 Bootstrap 旅程。本人虽然是个设计+前端的万里有一的人才,但是老天只让我会用 PS 和各种设计工具却不给我跟设计妹子一样的审美,所以这也是我最初选择 Bootstrap 的原因之一,它让我做出来的东西好歹能在妹子面前装个逼,不过时间长了难免觉得 Bootstrap 美的让人烦躁, 但好在它的每个版本都会有很大的改变,不会让人觉得自己做的网站会跟很多网站撞脸。Bootstrap 的用法及其简单( 这也可能就是 Bootstrap 作者阅攻城士无数,了解他们痛的结果 ),以至于是个小前端都可以快速上手,几乎没什么学习成本。

官网:http://getbootstrap.com/

Github:https://github.com/twbs/bootstrap/

作者:Mark Otto 和Jacob Thornton Star:118,264

总结:Bootstrap 最大的优势就是它非常流行,流行就代表你有问题就有很多人帮你解决问题,就代表装逼它就是利器,还有就是界面比较和谐,容易上手,关注它的童鞋应该发现最新 V4 版也开始支持 FlexBox 布局,这是非常好的升级体验。 劣势是 class 命名不够语义化,并且各种缩写,以至于我离了文档就是个菜,最近开始整混合 APP,选框架的时候首选就是它,但之前搞 PC 一直没注意,后来搞混合右键属性看它的时候,瞬间一阵凉风袭来,Bootstrap 好小,小到我只好选择别的框架。

查看更多

androidstudio项目目录结构解析

首先先上图
此处输入图片的描述

大家看到的是android studio 创建的项目清单【图方便,就用完整的项目来做示例 - - 】
app/build app模块build编译输出的目录( 关于上传svn或github需要忽略的文件待会说明)
app/build.gradle (主要配置 编译sdk版本、编译工具 、包名、sdk最低支持版本、目标sdk版本、app版本号、app版本名称、ndk等等)
app/app.iml app模块的配置文件(Intellij模块文件,很重要但是基本不用管,大家都知道Intellij是AndroidStudio的亲妈的嘛,所以有这个文件是正常的)
app/proguard-rules.pro app模块proguard文件(混淆配置文件,主要用于打包签名apk配置混淆代码[是否混淆是可选的])
build.gradle 项目的build.gradle编译文件,主要就是申明仓库地址和版本号
settings.gradle定义项目包含哪些模块[指引用了哪些外库]
local.properties 配置SDK/NDK
nearby.iml 项目的配置文件
External Libraries 项目依赖的Lib, 编译时自动下载的

AndroidStudio自动忽略

现在的AndroidStudio已经很智能了,当创建项目的时候自动给我们创建了一个
上传svn或git需要忽略的文件如下:
.gitignore 并给我们忽略了一些文件

*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures

手动忽略
1、.idea文件
2、.gradle文件夹
3、所有的build文件夹
4、所有的.iml文件
5、local.properties文件

一秒钟看懂SaaS、CRM、OA、ERP、HR、进销存

 自2014年以来,SaaS、CRM、OA、ERP、HR、APM、进销存、财务系统等,这些名词大量出现在微信朋友圈、电视楼宇广告和千百万融资资讯中。它们到底是什么意思?相互之间又有什么区别?在这个飞速发展的互联网时代,再不知道这些可就OUT了!

  SaaS、CRM、OA、ERP、HR、进销存究竟是什么?
  此处输入图片的描述
SaaS模式就像用自来水

  2015年被媒体和IT从业人员称为SaaS元年。什么是SaaS呢?SaaS是Software-as-a-Service(软件即服务)的简称,“软件即服务”,简单理解也就是“按需租用别人提供的软件服务”,它是一种软件交付模式。SaaS这个说法是区别于以往软件购买和交付方式而提出的。

  在以往,如果你的公司需要使用一款软件来管理财务记账,作为公司管理者,你需要向软件提供公司说明需求、支付购买软件的费用并提供安装软件的硬件环境,然后软件公司就会上门安装调试软件,调试完后就可以正式投入使用了。

  这里有一个很显著的特点是,软件都安装在你指定的地方,你拥有100%的管控权,相应的,你后续还需要继续投入人员和资源来维护系统的正常运行。

  SaaS的模式就不一样了,在客户还没有到来之前,软件提供公司就自己提服务器、数据库等硬件,把软件安装发布好,这样作为软件使用方的你就变得轻松很多,一上来就可以直接进行体验,体验之后,你觉得哪些功能合适你的,就挑选出来,按月支付比较低廉的费用就可以正式使用了。后续的升级、维护也由软件公司负责。简而言之,SaaS模式就是软件提供公司事先把所有的软件相关工作都归类准备好了,用户直接过来挑选自己需要的用就OK了。

  业内有一个很恰当的比喻:一开始的时候,各家都是自己挖井抽水蓄水,挖井抽水蓄水的技术是有专业的公司提供,但总的来说喝水这个事情是自家管自家的,这是传统软件的供水模式。在SaaS模式下,挖井抽水蓄水净水修水管这些工作对使用方来说都是透明的,你有需要的时候就打开水龙头取水就OK了,然后每月自来水公司会过来跟你结算。同样的,优缺点很明显,优点是按需用水省事了,成本变低了,缺点是水由水务公司完全控制,供水稳定性、供水质量取决于水务公司实力。

  CRM是什么呢?追踪客户的

  CRM是英文Customer Relationship Management (客户关系管理)的简称。这个比较好理解,就是用来管理客户的。

  一般来说,CRM客户管理系统由客户信息管理、销售过程自动化(SFA)、营销自动化(MA)、客户服务与支持(CSS)管理、客户分析(CA)系统这5大主要功能模块组成。

  通俗一点说,CRM系统特别是移动CRM系统能帮助你及你的同事很方便地记录客户信息、跟踪分析新老客户、挖掘潜在客户。

  OA是什么呢?管办公室活动的

  OA是Office Automation(办公自动化)的简称,本来OA涵盖的范围非常广泛,基本上所有和办公相关的系统都可以称作是OA,但现在大都数公司都把OA系统定义为企业内部的协作沟通系统,一般提供的功能有流程审批(请假报销等)、即时沟通、文档管理、内部论坛、任务管理、会议管理、通讯录、问卷调查等。

  ERP是什么呢?生产制造一条龙全包

  ERP是Enterprise Resource Planning(企业资源计划)的简称,从字面上理解,各企业的资源、计划相关的管理都可以算在ERP的范畴里,比如员工、生产、制造、财务、销售、采购、仓储、分销、质量等等,只要是用于企业管理的软件都属于ERP的范畴。由于越来越多的细分系统的出现,行业内人们为了做区分,一般把功能比较全面(往往包含从原料到生产到仓储到销售一系列)的偏生产制造的管理系统才定义为ERP系统,而其中某项细分功能的系统虽然原则上属于ERP,但一般不称为ERP。

  HR软件是什么?管员工的

  HR软件是human resource software(人力资源软件)的简称,就是用来管理人事相关的系统,比如招聘管理、职工管理、劳动合同、奖惩管理、办公用品、培训管理、绩效管理、考勤管理、社保管理等。

  什么是进销存?

  进销存是指企业管理过程中采购(进货)→入库(库存)→销售(销货)的三个管理过程。这三个过程是一般企业特别是中小商户的核心经营过程,用来管理这三个过程的系统就是进销存系统,简称进销存。

  什么是财务系统?

  财务系统是指专门用于完成会计工作的管理系统。财务系统一般包含:总账管理、固定资产管理、资金管理、客户及应收应付管理、报表管理、财务分析、核算系统等。

  SaaS、CRM、OA、ERP、HR、进销存、财务系统的区别在哪里?

  SaaS是一种软件交付(交易)模式,以这种“按需租用”模式提供服务的软件称为SaaS,目前大部分的软件都采取这种模式,也就是说大部分的OA、ERP、HR、进销存、财务系统都可以叫作SaaS软件。由于ERP系统覆盖的链条很长,一般需要深度定制,所以比较少是以SaaS提供的。

  现在的CRM、OA、HR、进销存、财务系统一般都以SaaS方式提供,CRM更专注于销售方面的管理,OA更专注于企业内部的协作沟通,HR更专注于人力管理,进销存专注于仓库相关的管理、财务系统专注资产、预算相关的管理。

  由于它们涉及到企业不同时间段、不同角色、不同业务等各个方面,同时也因为各企业的规模、经营方式几乎完全不同,所以目前没有哪一款产品能囊括CRM、OA、HR、进销存等这些功能,目前市面上的产品能还处于在自己专注的领域深耕发展的阶段。

  当然为了更快地拉开同竞争对手的差距,它们往往选择开放相互对接的方式,比较钉钉这些OA系统就提供了开放平台,用于对接进销存、财务系统。

  CRM、OA、ERP、HR、进销存、财务系统目前有哪些代表产品?

  CRM的标杆是美国的Salesforce,国内有纷享逍客、销售易、红圈营销、八百客等。

  OA在国内有钉钉、云之家、今目标、微信企业号、企业微信(即将上线)这几个产品,有很多稍微大一点的企业内部会自建OA系统,等内部使用实施成熟后也会开放出来供外部使用。

  ERP和财务系统,素来有“南金蝶北用友”之称,这两家拿下中国大部分市场份额,SAP则是全球最成功是ERP厂商,据称85%的世界500强公司都有使用SAP系统,但这套系统非常昂贵非常复杂,不适用于中小企业。

  HR。有北森、dayHR、金柚等,由于单纯的HR系统很容易被OA或进销存击穿,现在的HR往往做得非常深,人才评测、招聘等都会涉及。

  进销存系统,有管家婆、智慧记、云销城、秦丝生意通等,在采购、销售、库存这三个最核心的管理环节需求会非常强烈,但对于操作速度要求很高,一般软件很难满足,所以目前来说进销存的普及率还不到8%。

  2016年CRM、OA、ERP、HR、进销存、财务系统的趋势是怎么样的?

  1、SaaS化。对于提供方而言标准化的SaaS产品更具有爆发性,对于消费方而言SaaS具有低成本、随时随地接入访问这些特性,再加上IT基础设施、安全技术等方面的成熟,SaaS将成为以后最主要的软件模式。

  2、移动化。金蝶创始人徐少春在发布云之家的时候,把笔记本直接扔进垃圾桶了,说以后只使用手机办公,这虽然是一个噱头,但确实说明移动办公是个大趋势。

  3、垂直化。前面说过,不同规模、不同阶段、不同行业的企业对企业应用的需求千差万别,企业内部中不同岗位、不同时段、不同职别的员工对企业应用的需求同样也千差万别,往往需要垂直细分到具体的行业才有可能做精,做更好的体验。

  4、免费化。SaaS化、竞争白热化、周边资源可整合、软件边际成本趋零等这些原因会使得免费的企业级应用会越来越多。

  5、合纵连横化。条件成熟,创业公司有机会崛起,BAT头巨头大举进入,在这个巨大的看似类似却又碎片化的领域,接下来我们会看到一场场合纵连横的好戏会不断上演。

  6、更普及。以前信息化系统成本很高,往往只有大企业才有能力使用,现在条件成熟,投资机构热钱及创业者的热情投入,企业级应用空前繁荣,企业无论大小都能选择一款适合自己的应用。

  涨姿势:几个概念

  企业级应用。是指为商业组织、企业服务的应用系统,业内一般称为To B类应用,用于区别对个人类的应用(To C)。

  APM是Application Performance Management & Monitoring(应用性能管理 & 监控)的简称,是用来监控和管理应用软件是否有效运行的,为上面据说的系统提供相关的监控。

  EIP 是Enterprise Information Portal(企业信息门户)的简称,当一公司把前面所提到的OA、进销存、财务等等系统都使用上之后,使用人员需要在各个系统之间来回切换,非常麻烦低效,于是EIP就出现了,它就是把各种应用系统统一集成到一个入口系统中,在一平台时管理各个业务。

  客服系统可以说是CRM系统的延伸,主要提供在线客服聊天、机器人客服、帮助文档、客户反馈等功能。

原文地址

android开发的经验教训

  1. 在添加任何第三方party之前,请三思:这真的是一个成熟的项目吗?

  2. 如果一个东西用户看不到,就不要绘制它!

  3. 除非真的需要,否则别使用数据库;

  4. 达到65k方法数限制来的非常快,真的,非常快!不过 multidexing 可以拯救你;

  5. RxJavaAsyncTasks 以及其它杂碎的最佳替代者;

  6. Retrofit 可能是现在最佳的网络请求库;

  7. 使用 Retrolambda来简化你的代码;

  8. RxJava 和 Retrofit 以及 Retrolambda 结合起来会让你酷炸天!

  9. 我使用 EventBus而且它也很好,但是我并不会用太多,因为这样代码库会变得凌乱;

  10. 包名按照功能来,而不是按分层来;

  11. 把所有东西都移到 application thread之外;

  12. lint 可以帮助你优化布局与布局树,这样你就能识别出那些可能已经被移除的冗余的View;

  13. 如果你在使用gradle,使用一切可能的方式去加速它;

  14. 对builds做profile reports,以便知道什么占据了编译时间;

  15. 使用一个 有名的 架构;

  16. 测试时比较花时间,但是一旦你找到诀窍它可以比不使用测试更快、更健壮;

  17. 使用 依赖注入 让你的app更模块化,从而更易于测试;

  18. 收听 fragmented podcast 将会让你受益;

  19. 千万别用私人邮箱作为你安卓市场的发布者账号;

  20. 总是使用恰当的输入类型;

  21. Use analytics to find usage patterns and isolate bugs;

  22. 关注最新的 libraries(使用dryrun 来快速查看它们的的效果)

  23. 你的service应该做你所需的事情,并且尽快死去;

  24. 使用 Account Manager 来提示登录用户名和邮箱地址;

  25. 使用CI(持续集成)来构建和发布你的beta和产品apk;

  26. 不要运行自己的CIserver,维护server是费时的事情,因为磁盘空间,安全问题,更新server以防止SSL攻击等等原因。使用circleci, travis 或者 shippable, 它们便宜,而且你也可以少担心一些事情;

  27. Automate your deployments to the playstore;

  28. 如果一个library很大而你只需要使用其中的一部分功能,你应该寻找一个更小的来替代(比如依靠proguard );

  29. 不要使用多于实际需要的module。从零开始编译一个module或者仅仅是检查上个module是否最新所需要的时间几乎是加载 binary .jar/.aar依赖的4倍以上;

  30. 开始考虑用SVG来替代PNG

  31. Make library abstraction classes, it’ll be way easier to switch to a new library if you only need to switch in one place (e.g.AppLogger.d(“message”) can contain Log.d(TAG, message) and later realise that Timber.d(message) is a better option);

  32. 监控你的连接情况以及连接类型(wifi之下更新更多数据?);

  33. 监控你的电源和电量(在充电的时候更新更多的数据?电量低的时候暂停更新?);

  34. 一个用户界面就如一个笑话那样,如果你需要解释,那么证明它并不够好;

  35. Tests are great for performance: Write slow (but correct) implementation then verify optimizations don’t break anything with tests.

原文:Building Android Apps — 30 things that experience made me learn the hard way。