项目开发需要用到文字转语音
的功能,利用 Android 系统自带的Text-to-Speech
可以实现英文转语音
,但是对于中文就无能为力了。对于中文转语音需要特定引擎的支持,谷歌自带的Pico TTS
是不支持的,我的小米手机是度秘语音引擎
支持中文,显然我们没法去控制用户用什么手机,所以抛弃原生的TTS
,考虑接入讯飞语音SDK
。
注册开发者账号
进入讯飞开放平台注册账号。
那是一座悲欢离合聚集的楼。
最近在做收银机相关的开发,涉及到双屏异显
的一些东西,之前也没有接触过,在查阅一番资料之后,把功能走通了,这里小记一下。
Presentation 是一种特殊的对话框,主要用于在另外一块屏幕上显示内容。默认为克隆模式,即副屏显示和正屏一样的内容。当需要显示不同内容时,需要自定义 Presentation,并为其指定一个 Display。这里随便定义一个 Presentation:1
2
3
4
5
6
7
8
9
10
11
12public class MyPresentation extends Presentation {
public MyPresentation(Context outerContext, Display display) {
super(outerContext, display);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.presentation_second_screen);
}
}
前段时间终于下定决心自己实践 RxJava,Retrofit 等当前十分流行的库,利用 Gank.io 的公共 API,做一个自己的 Gank 客户端。项目地址: Gank。只要有闲暇时间便会写写代码,慢慢完善。期间有一些小的知识点,但是却很实用,这里便列一下。关于 RxJava,Retrofit 目前学习还不是很深入,这里便不展开了。
现在与服务端通信通常都是Json,但是服务器返回的Json串的key是服务端自己的命名规则(可能是中文key,或者大写开头),我们直接通过Gson解析就必须一一对应,但是这样的命名在Java里很不友好。
那么就可以通过@SerializedName注解给Bean类进行“重命名”,这样在解析的时候便可以直接利用我们自己的命名规则命名变量了。
举个栗子:http://gank.io/api/day/2017/08/03
返回的数据包含Android
,福利
等不符合Java规范的key,那么就可以这样:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16public class DataResults {
@SerializedName("Android")
List<ItemData> androidList;
@SerializedName("iOS")
List<ItemData> iOSList;
@SerializedName("休息视频")
List<ItemData> restList;
@SerializedName("前端")
List<ItemData> jsList;
@SerializedName("福利")
List<ItemData> welfareList;
}
如此便可以直接通过Gson解析,并且变量名是以我们自己的命名规则进行命令的了。
more >>Github 逛久了,相信大家都会有很多star
,虽然很多star
后面再也不会看的。但是只要有那么一丁点的可能回头看,我们还是需要将自己的star
整理一下,不然感觉都是无从下手。那么问题便来了:如何管理 Github 上的 star ?
答案便是 Astral。这是我偶然发现的一个网站,它可以用来给 Github 上的 star 分类。
具体界面是这样子的:
界面很简单,打开就能直接上手用,整理了一个下午,终于将自己的 200 多个 star 全部清理个便,分了几个 TAG,后面再回顾的时候便会方便多了。
普遍的 Android 开发可以理解为移动端界面开发,那么界面自然是重中之重。当设计师给到你设计稿时,你便需要将设计稿中的东西用代码做出来。
项目开发中便遇到了这样一个设计稿:
这算是一个很基本的对话框了,没什么难度。写这篇文章主要是为了记一下图中关闭按钮
的实现。
这个关闭按钮
算是再简单不过的一个图标了,那么要如何实现呢?当然可以找到设计师要切图。但是这里我想尝试一下 Android 中的 SVG,顺便也是减轻设计师的工作量,经常劳烦别人也不是什么好事。
List、Map等这类数据结构在日常开发中的使用不可谓不多,经常会有遍历的同时进行修改的情况。例如:1
2
3
4
5
6
7Integer[] numbers = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
List<Integer> list = new ArrayList<>(Arrays.asList(numbers));
for (Integer integer : list) {
if (integer % 5 == 0) {
list.remove(integer);
}
}
这段代码在执行的时候便会抛出异常:1
2
3
4Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at com.example.MyClass.main(MyClass.java:16)
这个异常出现通常是遍历一个集合的同时,在修改这个集合。看到next
方法:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public E next() {
this.checkForComodification();
int var1 = this.cursor;
if(var1 >= ArrayList.this.size) {
throw new NoSuchElementException();
} else {
Object[] var2 = ArrayList.this.elementData;
if(var1 >= var2.length) {
throw new ConcurrentModificationException();
} else {
this.cursor = var1 + 1;
return var2[this.lastRet = var1];
}
}
}
然后看到checkForComodification
:1
2
3
4
5final void checkForComodification() {
if(ArrayList.this.modCount != this.expectedModCount) {
throw new ConcurrentModificationException();
}
}
即当modCount 与 expectedModCount 不相等时,会抛 ConcurrentModificationException 异常
。其实很早之前就会碰到这个问题,使用Iterator
进行遍历和操作就不会出现这个问题了,但是一直没有深究其原因。
新手引导是每个 App 都具备的。如果新手引导直接用 Activity 来做,可能就会比较繁杂和冗余。所以一般都是 ViewPager 来实现。那么便会有 2 个问题:
昨天写关于 git 的文章的时候,需要来回切分支,而且 bash 也看不到当前是哪个分支,得不停git branch
来看,显得十分麻烦。于是便不得不逼着自己一把,来熟悉一波zsh
了。
同事有用zsh
的,而且鼎力推荐,因为目前的工作和学习与命令行的交集不是很深,所以一直没有开始用。最近发现bash
相比zsh
确实是难用许多,便只能硬着头皮来学习了。之所以是硬着头皮,是因为自己对 Linux 系统不是很熟悉,虽然现在是在用,但是对于 Linux 的很多特性都不是很了解,命令行、Shell 脚本算是 Linux 一大特色。
zsh
有着强大的功能,但是其配置也是异常复杂,于是 Github 上便有了这样的一个库:oh-my-zsh,oh-my-zsh
是为了简化zsh的配置而提供的一个配置模板,可以更好的管理zsh的各项配置。可以看到它有 55k 的 star,可见其火爆程度。现在才来接触,显得挺惭愧的。
关于oh-my-zsh
的安装直接照着 github 中的README
一步一步来就好了。就提醒一点,安装完之后需要注销掉用户,重启也可以,然后再重新登录,才可以看到zsh
。
相信选择选择绝大部分开发者都使用的 Git 来进行版本控制,关于 Git 比较基本的东西就不说了,这里主要记录一下我用到的 2 个较为进阶一点的命令。
场景:假定现在有一个分支develop/1.0.0
,该分支用于发布1.0.0
版本的包,develop/1.0.0
依赖一个 module,该 module 的版本与之对应也是1.0.0
,就在将要打包的时候, develop 分支新增了一个提交,这个提交依赖 module 的1.0.1
版本,可能是由于同事之间的沟通不足导致这种问题,不需要提交的被提交了。在发布1.0.0
版本的包时,是不应该包含最新的提交的。那么可以怎么样做呢?
revert 意为回退。可以使用git revert
指令,回退最新的一次提交。
举个例子:
初始化一个 git 仓库,添加一个文件git
,做一次提交init
。
然后编辑git
文件,做一次提交feature A
。
准备以当前节点打包时,又多了一次提交feature B
,此次提交是不需要包含到此次打包的代码里的。
混淆,相信只要是上线的的应用都会运用到。这里记一下项目中因为混淆而导致的一个较难发现的问题。
问题是这样的:有一个实体类PrintTemplate
类,当我调用一个网络接口,会从服务器获取这个类的一个 list,然后我会用 Json 转成字符串存到本地,当要用的时候根据 key 去取对应的模板字符串,然后转成类实体进行使用。当然,混淆规则中没有保持这个类不被混淆。
假设现在的版本是 V1.0,测试打出来的 Release 包是没有问题的。然后版本更新到 V1.1,单独测试也是没问题的。但是,如果是从 V1.0 升到的 V1.1,那么在取对应的模板字符串,然后转成类实体进行使用
这一步就会出错了,无法解析到正常的类。如果没有添加异常保护,则会直接崩溃了。
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