Android 学习月报 2016-6月
用Recyclerview实现瀑布流 设置 item 间距
SpacesItemDecoration decoration=new SpacesItemDecoration(16);
recyclerView.addItemDecoration(decoration);
public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
private int space;
public SpacesItemDecoration(int space) {
this.space=space;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
outRect.left=space;
outRect.right=space;
outRect.bottom=space;
if(parent.getChildAdapterPosition(view)==0){
outRect.top=space;
}
}
}
RecyclerView添加Header
思路1: 根据Adapter的itemType设置,根据不同的itemType去加载不同的布局。
思路2:根据LayoutManager 判断
LinearLayoutManager 的写法
mLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); mRecyclerView.setLayoutManager(mLayoutManager);
GridLayoutManager 的写法
mLayoutManager = new GridLayoutManager(this, 2);
重新onAttachedToRecyclerView 方法
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView);
RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
if(manager instanceof GridLayoutManager) {
final GridLayoutManager gridManager = ((GridLayoutManager) manager); gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return getItemViewType(position) == TYPE_HEADER ? gridManager.getSpanCount() : 1;
}
});
}
}
staggeredGridLayoutManager 的写法
@Override
public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {
super.onViewAttachedToWindow(holder);
ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
if(lp != null
&& lp instanceof StaggeredGridLayoutManager.LayoutParams) {
StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp;
p.setFullSpan(holder.getLayoutPosition() == 0);
}
}
项目需要读取对照表放在MAP里面开始用TreeMap发现顺序不对 换成 HashMap顺序也不对
最后查了一下LinkedHashMap 才能保证迭代的时候取出的顺序和存入的顺序相同
代码规范
- 有意义的注释
- 适当的方法封装
- 开发是多考虑代码的安全性,尽量不要用过期的方法
- 大括号不换号
Android Studio 编译速度 优化。
- 在你的$HOME/.gradle/gradle.properties文件里面添加下面代码
org.gradle.daemon=true
- 在你的${PROJECT.DIR}/gradle.properties文件添加下面代码
引用
org.gradle.parallel=true
project.android.dexOptions.preDexLibraries=false
- 直接运行command 来编译安装。
gradlew --offline installDebug
startActivityForResult和setResult详解
startActivityForResult与startActivity的不同之处在于:
- startActivity( )
仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( )。
- startActivityForResult( )
可以一次性完成这项任务,当程序执行到这段代码的时候,假若从T1Activity跳转到下一个Text2Activity,而当这个Text2Activity调用了finish()方法以后,程序会自动跳转回T1Activity,并调用前一个T1Activity中的onActivityResult( )方法。
相关函数:
startActivityForResult(Intent intent, Int requestCode)
setResut(int resultCode, Intent intent)
onActivityResult(int requestCode, int resultCode, Intent intent)
数据脱敏
敏感数据(如信用卡号码)、个人识别信息(如社会安全号码)、医疗诊断和甚至非个人的敏感数据(例如公司财务信息和知识产权)的曝光,是由于企业员工和外部人士滥用职权或工作失误所致。”
数据脱敏技术的目是通过从客户端隐藏敏感数据,以防止这些数据的滥用。技术供应商提供了多种数据脱敏技术,例如用相似的字符替代一些字段;用屏蔽字符(例如,‘x’)替代字符;用虚拟的姓氏替代真正的姓氏,以及在数据库数列中对数据进行重组。数据脱敏也被称为数据混淆、数据保密、数据消毒、数据扰频、数据匿名化和数据认证。
采用数据脱敏技术,可以帮助企业提高安全性和保密等级,以防止其数据被滥用。与此同时,数据脱敏技术也可帮助企业满足安全性的规范要求,以及由管理/审计机关所要求的隐私标准。
android studio 中添加arr库
先将aar文件复制到libs目录下。
打开内部的build文件:
在dependencies下添加:
compile(name: 'playersdk', ext: 'aar')
再打开外部build文件:
allprojects {
repositories {
flatDir {
dirs 'libs'
}
jcenter()
}
}
linux curl
- get方式提交数据:
curl -G -d "name=value&name2=value2" http://www.baidu.com
- post方式提交数据:
curl -d "name=value&name2=value2" http://www.baidu.com #post数据
- 设置http请求头信息:
curl -A "Mozilla/5.0 Firefox/21.0" http://www.baidu.com
Glide 抛出 You cannot start a load for a destroyed activity 异常
不要再非主线程里面使用Glide加载图片,如果真的使用了,请把context参数换成getApplicationContext。
android-apt 插件
- 作用:协助Android Studio 处理annotation processors, 它有两个目的:
允许配置只在编译时作为注解处理器的依赖,而不添加到最后的APK或library
设置源路径,使注解处理器生成的代码能被Android Studio正确的引用
集成到项目中:
//配置在Project下的build.gradle中
buildscript {
repositories {
mavenCentral()
}
dependencies {
//替换成最新的 gradle版本
classpath 'com.android.tools.build:gradle:2.1.0'
//替换成最新android-apt版本
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
//配置到Module下的build.gradle中
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
````
- 使用方法
```gradle
dependencies {
apt 'com.squareup.dagger:dagger-compiler:1.1.0'
compile 'com.squareup.dagger:dagger:1.1.0'
}
Gradle 自动化签名打包
apply plugin: 'com.android.application'
android {
signingConfigs {
release {
keyAlias 'yesauc'
keyPassword 'yesauc'
storeFile file('./release.jks')
storePassword 'yesauc'
}
}
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.yesauc.yishi"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
multiDexEnabled true
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled false
shrinkResources true
debuggable true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile 'com.android.support:support-v4:23.2.0'
}
ViewPager.setOffscreenPageLimit(0) 不生效
原来见log
Requested offscreen page limit 0 too small; defaulting to 1
Java 8 新特性使用
- Lambda表达式
Collections.sort(names, (String a, String b) -> { return b.compareTo(a);});
这段代码比之前的更加简短和易读。但是,它还可以更加简短:
1Collections.sort(names, (String a, String b) -> b.compareTo(a));
只要一行代码,包含了方法体。你甚至可以连大括号对{}和return关键字都省略不要。不过这还不是最短的写法:
1names.sort((a, b) -> b.compareTo(a));
- Optional
Optional是一个简单的值容器,这个值可以是null,也可以是non-null。考虑到一个方法可能会返回一个non-null的值,也可能返回一个空值。为了不直接返回null,我们在Java 8中就返回一个Optional.
推送服务的选用
选择IM云服务供应商,其实最重要是有三个因素:费用、技术稳定性、以及后续运维服务。
对于不少创业公司来讲,可能需要找到成本和稳定性的最佳平衡点。目前国内不少IM云服务产品都推出了免费服务项目或者一定期限内的试用。几大主流的IM云服务供应商如下:
- 阿里悟空:今年刚刚推出不久,目前为吸引用户,对外免费。据称产品稳定成熟后会探索收费策略。不过近期也有消息传出阿里或将撤销该业务,甚至有论坛曝出其已经停止维护:
- 网易云信:提供两个月的免费试用。功能较为完善,覆盖IM基础功能以及基于三大通讯运营商的短信、电话等服务,属于网易to B业务的重要项目,倾向于打造收费且稳定的服务品质。
- 腾讯云:11月份推出云通讯解决方式,主要提供IM基础功能。可以申请免费试用,但每天有名额限制。
- 融云:IM基础服务免费,例如聊天、通话等基础功能。高阶功能收费。
讲讲我熟悉的融云
优点:自带 UI,简单集成,开箱即用 ,免费使用 ,增值收费。
缺点:服务不稳定,有时候会碰到收不到消息的问题