IM 国外公司,服务费,方案

一、海外提供IM服务的公司

1.1 Sinch

官网: https://www.sinch.com/products/instant-messaging/
收费介绍
Snich_pricing

Read More

Share Comments

Android 增量更新整理

背景

在前几年,整体移动网络环境相比现在差很多,加之流量费用又相对较高,因此每当我们发布新版本的时候,一些用户升级并不是很积极,这就造成了新版本的升级率并不高。而google为了解决了这个问题,提出了Smart App Update,即增量更新(也叫做差分升级)。

增量更新与热修复完全不是一个东西。增量更新需要重新安装apk,而热修复不需要。热修复也能完成部分增量更新的功能。

增量更新的流程

增量更新的具体流程是:用户手机上安装着某个应用,下载了增量包,手机上的apk和增量包合并形成新的包,然后再次安装(注意这个过程是要重新安装的,当然部分应用市场有root权限你可能感知不到)。

Read More

Share Comments

ThreadLocal一个使用——SimpleDateFormat

背景

之前写过一篇文章:《ThreadLocal、HandlerThread、Lopper区别》,其中简单提及了ThreadLocal的解释。本篇文章主要结合具体应用场景——SimpleDateFormat,和大家来一起学习ThreadLocal的原理,并对ThreadLocal进行一个详细的介绍。

下面是本文的参考资料:

java学习记录–ThreadLocal使用案例——SimpleDateFormat:
http://blog.csdn.net/u012706811/article/details/53231598

SimpleDateFormat的线程安全问题与解决方案:
http://www.cnblogs.com/zemliu/archive/2013/08/29/3290585.html

前言

Thread这个类有一个变量:ThreadLocal.ThreadLocalMap threadLocals。

这是一个map的数据结构,里面的元素的key就是ThreadLocal,value就是我们自定义的一些目标类。

我们可以在自己的多线程类中定义好几个ThreadLocal,然后每一个ThreadLocal put一个特定的目标类,然后以后可以用ThreadLocal get到目标类(ThreadLocal用自己作为Thread里map的key),因为每个Thread有自己独自的map,所以这样可以实现每个线程有自己的LocalThread,并且一个Thread里可以有多个LocalThread。

ThreadLocal为变量在每个线程中都创建了一个副本,所以每个线程可以访问自己内部的副本变量,不同线程之间不会互相干扰。

本篇文章结合具体应用场景,来分析ThreadLocal为什么可以实现不同线程之间不会互相干扰。

Read More

Share Comments

Hexo 模板学习——Hexo 结构

起步

Hexo会读取根目录下的_config.yml里面的theme属性, 从而采用对应的主题。而主题都是放在themes/目录下面的,然后你会发现他里面有个landscape的目录,这个就是默认主题啦。

接着,我们查看themes/landscape/目录,以及根据文档docs-themes,我们很容易得出:一个主题其实由4部分组成。

  • _config.yml: 主题的配置文件
  • source/: 放我们的CSS文件以及图片
  • layout/: 模板文件
  • scripts: 放JavaScript文件,他们会自动加载

根据文档docs-templates,下面表格中每个页面都有一个可用的模板,可以没有这些模板,但至少要有一个index模板。

Read More

Share Comments

Hexo 模板学习——EJS介绍

什么是EJS?

EJS是JavaScript模板库,用来从JSON数据中生成HTML字符串

EJS的语法和功能:

1、缓存功能,能够缓存已经解析好的html模版

2、<% code %>用于执行其中javascript代码。

<% alert('hello world') %>

3、<%= code =%>会对code进行html转义;

Read More

Share Comments

nodejs入门

本文是我自己的学习笔记,整理自《Node入门》

Node入门

作者: Manuel Kiessling
翻译: goddyzhao & GrayZhang & MondayChen

本书致力于教会你如何用Node.js来开发应用,过程中会传授你所有所需的“高级”JavaScript知识。本书绝不是一本“Hello World”的教程。

服务端JavaScript

JavaScript最早是运行在浏览器中,然而浏览器只是提供了一个上下文,它定义了使用JavaScript可以做什么,但并没有“说”太多关于JavaScript语言本身可以做什么。事实上,JavaScript是一门“完整”的语言: 它可以使用在不同的上下文中,其能力与其他同类语言相比有过之而无不及。

Node.js事实上就是另外一种上下文,它允许在后端(脱离浏览器环境)运行JavaScript代码。

Read More

Share Comments

JAVA泛型通配符T,E,K,V区别,T以及Class<T>,Class<?>的区别

文章转载自《JAVA泛型通配符T,E,K,V区别,T以及Class,Class<?>的区别》

1. 先解释下泛型概念

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。Java语言引入泛型的好处是安全简单。

在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。

Read More

Share Comments

Hexo 出错情况收集

Error: Cannot find module ‘./build/Release/DTraceProviderBindings’

我在更新hexo,准备安装别的module时,不小心按到了 ctrl+c,结果发现使用hexo命令会报如下错误:

{ [Error: Cannot find module './build/Release/DTraceProviderBindings'] code: 'MODULE_NOT_FOUND' }    
{ [Error: Cannot find module './build/default/DTraceProviderBindings'] code: 'MODULE_NOT_FOUND' }
{ [Error: Cannot find module './build/Debug/DTraceProviderBindings'] code: 'MODULE_NOT_FOUND' }

Read More

Share Comments