Mako Shan

Mako 是一名密码朋克爱好者
这里是我记录生活和成长的地方

联系我的微信号
👏欢迎一起交流学习

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 才能保证迭代的时候取出的顺序和存入的顺序相同

代码规范

  1. 有意义的注释
  2. 适当的方法封装
  3. 开发是多考虑代码的安全性,尽量不要用过期的方法
  4. 大括号不换号

Android Studio 编译速度 优化。

  1. 在你的$HOME/.gradle/gradle.properties文件里面添加下面代码
org.gradle.daemon=true
  1. 在你的${PROJECT.DIR}/gradle.properties文件添加下面代码

引用

org.gradle.parallel=true 
project.android.dexOptions.preDexLibraries=false
  1. 直接运行command 来编译安装。
gradlew --offline installDebug  

startActivityForResult和setResult详解

startActivityForResult与startActivity的不同之处在于:

  1. startActivity( )

仅仅是跳转到目标页面,若是想跳回当前页面,则必须再使用一次startActivity( )。

  1. 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,简单集成,开箱即用 ,免费使用 ,增值收费。
缺点:服务不稳定,有时候会碰到收不到消息的问题

0
Mako Tweet
目录