项目开发中,我们的 App 这个 Module 定义了3个 buildType:
1 | buildTypes { |
通过参数 HOST_TYPE 来指定数据的环境。debug 为内网测试版,beta 为外网测试版,release 为正式版本。
项目有3个产品线:手机、POS机、收银机,Module 的依赖是这样的:
App 作为 Application,其他作为 Library。
项目开发中,我们的 App 这个 Module 定义了3个 buildType:
1 | buildTypes { |
通过参数 HOST_TYPE 来指定数据的环境。debug 为内网测试版,beta 为外网测试版,release 为正式版本。
项目有3个产品线:手机、POS机、收银机,Module 的依赖是这样的:
App 作为 Application,其他作为 Library。
之前有一个关于 MVP 的疑惑:1个 Presenter 能否对应多个 View?,在我的这篇文章中有写过。现在回过头来仔细想想,感觉有点不对劲:1个 Presenter 为什么会有对应多个 View 的需求呢?那篇文章中的使用场景是:
我有 A B C 三个页面,我有一个 Presenter,用来处理一个数据类型的增删改查,但是界面上,A界面只需要查询,B界面只需要删除,C界面只需要增和改。
我们都知道,Presenter 是用来抽离 Activity 或 Fragment 中的业务代码的,何为业务代码?就是这个页面涉及到的业务逻辑。关于数据的增删改查,那是 M 应该做的事,而绝不是 Presenter 该去处理的。 所以,Presenter 应当只对应一个 View,如果有界面复用 Presenter 的情况,那我们得考虑为什么会有这种情况呢?复用 Presenter 代表着业务逻辑是一致的,不同的页面理当有着不同的业务逻辑。当然,这里说的业务是简单,最小颗粒化的业务,如果一个页面十分复杂,Presenter 中集合了大量业务代码,那么在某些小的页面是有可能复用 Presenter 中的部分业务代码的。所以这种情况下,Presenter 会对应多个 View,那么这个场景使用上篇文章中的做法是可以的:复用 Presenter,将 View 抽离,利用继承实现多个界面的定制需求,但不会是上篇文章中的那种使用场景。
more >>写过几个星期的 Kotlin 代码了,再也不用 findViewById 了,使用起来稍微简洁一点。今天小结一下,基础用法就不多说了,直接写几点我感触较深的。
当使用Java开发的时候,我们的代码大多是防御性的。如果我们不想遇到 NullPointerException,我们就需要在使用它之前不停地去判断它是否为 null。Kotlin,则是空安全的,我们可以通过一个安全调用操作符 (写做 ? )来明确地指定一个对象是否能为空。
1 | // 这里不能通过编译. Artist 不能是 null |
关于 Elvis操作符 其实是三目条件运算符的简略写法。可以这样理解:
最近写过一个界面,涉及到排序。
用到了 Collections 中的 sort 方法:
1 | Collections.sort(mData, new Comparator<BookMemberReport>() { |
Collections 根据传入的 Comparator 进行排序。刚开始写的时候通过不停的试,把正确的结果给试出来了。但是对于其原理却不是很清晰,今天便稍微扒一扒其源码。
more >>项目开发,引进了一个新的三方库,导致之前能运行的代码出现问题,错误堆栈:
1 | FATAL EXCEPTION: main |
最近随着 Google 的大力推荐,越来越多开发者开始使用 Kotlin 了。其实我对 Kotlin 的并没有很特别的感觉,它就类似于 Swift 相比于 OC,大量的语法糖着实能使写代码的效率变高,但是是否能左右 Android 开发的现状还未可知。我接触 Kotlin 的主要原因是:业务代码太无聊啦。相信很多开发者都跟我有同样的感触,在一个公司待久了,技术框架摸透之后,后面的开发就基本是纯业务开发了,写界面,写业务代码,对于技术提升没有什么实质的帮助,就是真正的码农。为了改变这一现状,我不断在新需求中使用一些新的技术,比如 RxJava、Retrofit 等等,说是新技术其实也不新了,都出来都很久了,只是自己在项目中没有用到,接触得不多。在新需求中引入这些技术,可以边开发边学习,解决写业务代码的无聊,还能拓宽视野,学习新知识。虽然不一定会成为主流,但学习一下总是没问题的,因此开始接触 Kotlin。这篇文章主要先讲讲 Kotlin 的配置。
最新的 Android Studio 已默认装了 Kotlin 插件了,在旧版本可自己手动安装 Kotlin 插件。
more >>习惯了用 LinearLayout、RelativeLayout 等布局,但是在某些界面的优化上这些布局很难做到。说下我项目中的实际例子:
一件商品有品名、数量、单价、金额等几条属性,要显示在一行。 注意,图中金额属性没有显示全,但这不是本文要写的内容。当文本过长显示不下,这是个历史难题。 本文要讲述的是如何利用约束布局来优化界面的显示。
看到图中,我们通长使用 LinearLayout 的 weight 属性,给每一列设置一个 weight,相信大多数人都是这么做的,就像这样:
之前的一篇文章Retrofit初识尝试用了下 Retrofit。说来惭愧,到现在才写这篇文章。由于项目中没有使用的缘故,一直停留在了解的程度。最近自己学习做了个Gank客户端,一点点学习当前主流的技术,今天研究了下 Retrofit 的源码,颇有感触,便记录下来。
关于正常的使用,参考之前的那篇文章。这里再写一下结合 RxJava 的使用。
1 | public interface GankService { |
1 | Retrofit retrofit = new Retrofit.Builder() |
1 | GankRequestManager.getInstance().getCategory(type, PAGE_SIZE, mPage) |
之前写过一篇Gradle多版本管理,主要是通过productFlavors来控制产品版本。这篇文章将结合buildTypes来说一下多版本管理。
在正常开发中,我们一般会有至少 2 个环境:Debug、Release,即测试环境和生产环境。显然这 2 个环境要用 2 套不同的数据,那么在我们的 App 里必然就需要有个地方来控制这个环境。当然,我们可以在 Debug 的时候用 Debug 环境,然后当要发版时手动改成 Release 环境,但是这很麻烦,很难排除忘记修改的情况,那么等待重新编译将是个很漫长的过程。其实Gradle可以很好的解决这个问题:利用 buildTypes 来控制编译类型。
buildTypes 默认会有 debug、release 2 个类型,当然我们还可以添加自己的。比如有个beta环境,用于外网测试。当对接一些三方平台的接口时,有的只能用外网,那么只能整一套外网的测试环境了,比如美团外卖。好,现在假设我们有 debug、beta、release 3 个 buildTypes,然后 pad、phone、custom 3个 productFlavors,接下来就是针对这些环境做配置了:
tag:
缺失模块。
1、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
2、在根目录_config.yml里添加配置:
jsonContent:
meta: false
pages: false
posts:
title: true
date: true
path: true
text: true
raw: false
content: false
slug: false
updated: false
comments: false
link: false
permalink: false
excerpt: false
categories: false
tags: true