Race604

Android

Android的Parcelable自动生成

Android中大量用到Parcelable对象,实现Parcable接口又是非常繁琐的。下面有几个工具可以减轻你的痛苦。 Parceler 通过注解及工具类自动完成实体类 Parcelable及值传递。基本用法如下: @Parcel public class Example { String name; int age; public Example(){ /*Required empty bean constructor*/ } } // wrap to parcelable Parcelable wrapped = Parcels.wrap(new Example()); // unwrap Example example = Parcels.unwrap(wrapped); 可以看出Parceler使用起来非常方便,代码也非常整洁。 需要注意的是,Parceler支持绝大部分的数据类型,但是也有些不支持,例如DateTime,如果你使用了这写类型,编写代码的时候并不会提醒你,这只会在运行过程中给你报错。 1. Intellij/Andri

By Race604

Android

Android上实现进入详情展开的动画

Android Lollipop中引入的Material Design,概念中要求任何变化都是流畅的,不能突然出现和消失。Instgram的工程师实现的了如下图所示的效果: 作者的原文在这里,讲了一些实现方法,并附上了源代码。 这里总结一下实现的关键点。 进入详情页时,禁用Acitivity切换的动画,使ToolBar(或者ActionBar)看起来就像没有变一样: overridePendingTransition(0, 0); 设置详情页的Activity的背景为透明,详情页动画的时候,还能看到原来的页面。设置Activity的Theme如下: <style name="AppTheme.CommentsActivity" parent="AppTheme"> <item name="android:windowBackground">@android:color/transparent</item> <item

By Race604

Android

LinearLayout的divider属性

我们都知道ListView的divider属性,没有想到LinearLayout也有divider属性,定义其中各个item之间的分割线的样式,使用这里有一篇长长的文章来说使用divider的好处。使用方法也摘抄自这篇文章: 先定义一个Drawable,文件名为:drawable/spacer_medium.xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <size android:width="@dimen/spacing_medium&

By Race604

Web

博客导航栏的优化

博客默认的导航栏在移动设备上的显示各种难看,一直是一个心病。今天抽时间修复了一下,在移动设备上显示也非常优雅了。 MEAN.io的导航栏用的就是Bootstrap的navbar,它本身能很好的兼容移动设备,这里有一个例子。可见是mean.io没有用好。参照前面的例子,下面来进行修改。 导航栏的代码在packages/system/public/views/header.html里面。需要修改如下: <div class="container-fluid" data-ng-controller="HeaderController"> <div class="navbar-header"> <!-- 收起来时的toggle button,注意data-target的值要和后面的对应 --> <button type="button"

By Race604

Android

Android中使用sqlite3工具

我们知道Android中数据库使用的是Sqlite,这个是一个轻量级的关系数据库。每个App的数据文件一般是放在/data/data/package.name/databases/dbname.db路径下面。 使用方法如下: $adb shell # 操作SettingsProvider内容 sqlite3 /data/data/com.android.providers.settings/databases/settings.db # 查看所有的system设置 >select * from system; # 设置某个值 >update system set value=1 where name='key_name'; 大部分的Android机器都把sqlite3工具给裁剪掉了,使用上面的命令,会提示sqlite3命令找不到。 解决方法是可以从模拟器,或者有sqlite3工具的机器中pull出sqlite3可执行程序,一般在/system/xbin/

By Race604

Web

博客列表页优化

博客快写了20篇了,首页有点太长了。考虑优化一下。 显示摘要 之前在列表页也是全文显示,这里做一个简单的截取,仅取文章前200字符做为摘要。为了避免把句子和Mardown语法截取一半,就会造成混乱,做法是找200字符最后最近的换行符作为截取点。代码如下,虽然有点暴力,显示效果还可以: for (var i = articles.length - 1; i >= 0; i-=1) { var content = articles[i].content; if (content.length > 200) { var idx = content.indexOf('\n', 200); if (idx === -1 || idx > 400) { idx

By Race604

Algorithm

牛顿插值法

最近一个同学问我关于插值的实现问题,推荐了一种牛顿插值法,给我一个参考文字,越看越觉得悲伤,数学符号、术语,什么泰勒公式,拉格朗日展开全都忘记了。各种公式推导,完全看不明白。 心里突然有些焦虑,两三年的工作下来,很多东西都全丢了,好像也很难再拣起来了。工作中用到的东西都是东拼西凑,真正自己创造的东西又有多少? 伤感完了,继续看牛顿插值法,这种插值算法的优点是插值节点增减,不会影响插值基函数。用程序来说,就是插值节点多少并不影响代码的实现,只是计算迭代次数多少的问题。总之,牛顿插值法很好工程实现。可以参考这个课件,说理论比较浅显,还能看明白。实现的代码在这里有。把C语言的实现摘抄如下: #include<stdio.h> void main() { float x[11],y[11][11],xx,temp,newton; int i,j,n;

By Race604

Web

我的博客数据自动备份脚本

之前的这篇MongoDB的数据备份里面提到了一些基本备份命令。我需要把远程的服务器上的数据备份到本地,以防远程Server挂掉而丢失数据。弄了几次,发现这样手动操作实在是太麻烦了。怎么做到全程自动备份?操作如下: 先写一个dump.sh脚本: #!/bin/sh export LC_ALL="en_US.UTF-8" dbname='jlog-prod' if [ $# -gt 1 ]; then $dbname=$1 fi cd ~/backup/ rm -rf $dbname mongodump -d $dbname -o . tarfile=$dbname-`date +%Y%m%d`.tar tar cf $tarfile $dbname

By Race604

Android

Android的ListView/ScrollView支持回弹效果

看到iOS里面的Table和ScrollView都能在拉到头的时候,还能继续滑出来,松手就弹回去,感觉确实很爽。但是Android上默认是没有这个效果的,很多第三方rom或者app都支持这种效果。 搜索了一下才发现这篇博客,原来Android2.3中就支持overscroll功能。但是实现机制和iOS不一样,可能是专利的问题。Android上实现很简单,如果拉到底了,就会在边上出现发光效果。我们可以很容易修改,达到像iOS上面那样的效果。代码如下: public class BounceListView extends ListView{ private static final int MAX_Y_OVERSCROLL_DISTANCE = 200; private Context mContext; private int mMaxYOverscrollDistance; public BounceListView(Context context){ super(context); mContext = c

By Race604

Android

Android中移除TextView上下的空间

我们知道在Android中,使用TextView的时候,文字的上下都会默认留一些空间。特别是TextView中添加一个背景颜色的时候,就会特别明显。如果你想移除这个空间,设置: android:padding="0dp" 没有任何效果,甚至设置padding为负数,都不能减少其空间。正确的做法如下: android:includeFontPadding="false" TextView的android:includeFontPadding属性,官方文档的解释是: Leave enough room for ascenders and descenders instead of using the font ascent and descent strictly. (Normally true). 大概的意思是:用来设置是否预留足够文字上下行距离的,而不是用字体的行间距,一般情况是true。 参考StackOverflow上的答案。这里是官方文档

By Race604

Android

Android中的SwipeRefreshLayout

在Android的官方v4的包里面有一个import android.support.v4.widget.SwipeRefreshLayout。 官方文demo,可以直接下载源代码download1, download2. 不得不惊叹Google牛x。SwipeRefreshLayout是一个滑动刷新的终极解决方案,可以Swipe任何的的view。也不用重在任何View,使用起来很简单,如下(参考): <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/swipe_container" android:layout_width="match_parent" android:layout_height=

By Race604

Android

Retrofit使用配合GSON

在前面的这篇文章中Android开发的5个神器中,推荐了Retrofi库,这是一个网络请求库,默认是使用Gson解析JSON数据。 Gson解析JSON数据,默认是把JSON的字段名和java对象的变量对应。如果不一样,可以用Annotation声明对应的JSON字段名,如下: public class User { @SerializedName("userid") public String uid; @SerializedName("username") public String name; } 对应的Json就是这样的: { "userid": 123; "username": "Jack" } 还有一些控制Java对象中的成员是否需要序列化的方法。 * transient关键字,可以控制不进行序列化和反序列化JSON * @Expose可以精细控制序列化和反序列化 public class Account { @Expose(deserialize = false) private String account

By Race604

Android

Android获取设备相关信息

获取设备相关信息,是很多App想要做的事情。Android设备相关的信息有:电话相关的信息,Wifi模块相关信息。下面分别介绍一下相关方法。 获取电话相关信息 获取电话相关信息,主要是利用TelephonyManager这个service提供的接口。这里有很详细的文章介绍。这里主要列几个常用的接口: TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE); String imei = tm.getDeviceId(); //取出IMEI String tel = tm.getLine1Number(); //取出MSISDN,很可能为空 String iccid =tm.getSimSerialNumber(); //取出ICCID String imsi =tm.getSubscriberId(); //取出IMSI 注意,使用这个Sevice需要在AndroidManifest.xml中添加如下权限: <uses-p

By Race604

Web

MongoDB的数据备份

写这个Blog到今天也有一点心血,如果数据突然丢了也挺可惜的。今天看了一下,在数据量不是很大情况下,MongoDB的数据备份还是非常方便的。原文参考MongoDB整库备份与还原以及单个collection备份、恢复方法。 mongodump备份/mongorestore恢复 这个方法备份是把数据库里面的内容整个dump成BSON文件,使用很简单。 备份: mongodump -d <dbname> -o <dest_dir> 或者 mongodump -h <dbhost> -d <dbname> -o <dest_dir> -h:MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017

By Race604