自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

江南的博客

欢迎大家一起交流学习心得

  • 博客(35)
  • 收藏
  • 关注

原创 如何解决本地大批量数据的更新,和后台的同步,讲解socket的IPC和socket的通讯

Android的功夫,在Android之外。这句话我很认同,Android Framework只不过是对底层系统的封装,要想深入理解它,必须熟悉JNI、读得懂C++、理解Java虚拟机、Linux系统甚至汇编、指令集等等。但是并不意味这你作为一个开发就一定都得会这些,我相信等你学完上述那些知识,可能已经换一个操作平台了,当然如果你真的掌握了这些,下一代操作系统是什么已经不重要了。今天我们要讲的...

2018-10-16 18:41:17 1105

原创 nodejs的相关问题2

当年Android选用最流行的java写的时候,很多熟悉服务器开发的人都转为android开发,为了表示和android彻底划清界限的决心,服务器代码决定用nodejs开发(开玩笑的,nodejs适用于中小型企业的快速开发的技术选型)。笔者这里不去比较nodejs和java做服务器开发的优劣,仅仅换个角度为了实现我们最新项目的时候,服务器开发技术选型,讲解nodejs的一个核心的网络框架,甚至曾经...

2018-10-11 15:50:45 436

原创 nodejs的部署的问题

因为我们要管理很多依赖,最后我们选择使用autod来管理,autod:一个自动分析项目所有的文件,获取所有的项目依赖和它们的版本的工具。autod 同时可以根据我们传递的一些选项和参数,来直接更新 package.json 文件:通过这个工具,我们可以很轻松的跟踪到所有依赖的最新版本,同时可以自动更新我们的 package.json 文件,新引入的模块也不需要手动去更新 packa...

2018-10-10 13:14:16 3418

原创 类似于talkingdata的灵动功能的实现

随着业务的发展,每个公司都希望能够完善自己的数据采集,这里我们采用了AOP的方式对数据进行无埋点收集。但是有时候我们希望可以通过配置的方式决定收集什么数据,这个配置最好是让不懂开发的人去配置,比如运营,领导等,那么如何做成可视化的界面让对方能够动态的配置是我们现在需要解决的问题:如何实施的返回收集的界面数据 如果是通过截图的方式,大量频繁的截图,效率问题如何保证经过我们技术的讨论我...

2018-10-08 18:03:33 1044

原创 android使用Python脚本编译侯建我们所需要的所有的库

使用Python需要注意的一些事项比如我们想使用modules库下的common.py的类,我们得导入,但是导入的话如果没有__init__文件的话导入不了的,这点得注意from modules import common__init__.py,为什么必须得使用这个呢这个跟java有点区别,java中只要是在一个项目中的所有的类都可以通过包名导入,Python,__init__....

2018-09-27 14:52:33 1931

原创 移动自动化测试框架拓展

相关背景目前国内许多公司都开始使用自动化测试,尤其是最近这几年,自动化测试更是受到了越来越多的青睐。常见公司产品的商业化,使其不可能做到一个产品结构的经常变动的。这就给自动化技术提供了基础。常见的自动化测试包括客户端和移动端,本文旨在讨论移动端的测试化。目前常见的移动自动化测试,主要分布在以下三个层面,UI层面、接口层面和单元测试。虽然移动化测试能提高测试团队的测试效率,但也只是在特定场景...

2018-08-31 17:51:11 1165 1

原创 开发中灵活运动抽象

public interface IAndroidCanvasHelper { void init(int width, int height); void draw(final CanvasPainter canvasPainter); Bitmap getOutputBitmap(); interface CanvasPainter { vo...

2018-08-29 13:49:55 177

原创 android自动化测试的实践

功能性测试:App启动过程中的耗时情况 CPU占比率 流量消耗情况 电量消耗情况 内存消耗情况 流畅度(FPS,就是每秒钟的帧数,流畅度,流畅度通过该指标就可以看到app流畅度异常的情况) 过度渲染(流畅度一个方面就是过度渲染)环境的配置android sdk(这个可以去android的官网下载,地址:https://developer.android.com/studio/...

2018-08-22 17:22:52 4021 1

原创 相关知识点

1:tcp/ip协议2:Socket原理3:多进程相关的4:View事件分发源码5:HashMap源码,原理,增删的情况后端数据结构如何位移,如何变得线程安全,每种方式的优缺点HashMap内部通过维护一个Entry<K, V>数组(变量为table),来实现其基本功能,而Entry<K, V>是HashMap的内部类,其主要作用便是存储键值对,其数据结...

2018-08-14 11:22:56 832

原创 ASM 操作字节码

JVM的类型签名对照表 Type Signature Java Type Z boolean B byte C char S short I int J long F float D double L fully-qualified-class ;fully-qualified-class ...

2018-08-13 10:47:10 2895

原创 JVM指令集整理

看字节码从这里开始。指令码 助记符 说明 0×00 nop 什么都不做 0×01 aconst_null 将null推送至栈顶 0×02 iconst_m1 将int型-1推送至栈顶 0×03 iconst_0 将int型0推送至栈顶 0×04 iconst_1 将int型1推送至栈顶 0×05 ...

2018-08-13 10:06:03 2946 1

原创 注解与依赖注入

最近看到facebook扎克伯克一番话,很有味道,你不需要等到够优秀才开始,你应该立即开始去变得优秀。1注解 1.1什么是注解1.2为什么要使用注解1.3自定义注解1.4java内置了哪些注解2学习的新技术3感悟注解 什么是注解?         注解是一种元数据(描述数据的数据),它是一种描述作用,在编译前和运行时获取注解信息。为什么要使用注解 比如这段代码@Overrid

2017-07-29 21:06:45 2848 1

原创 聊聊你不知道的建造者设计模式

距离上次写博客的距离也快一个月了,最近打算跟大家分享一下建造者模式,其实这个模式以前也介绍过只是泛泛的介绍,并没有深入的去说明其中的逻辑性,由于这次跟王大哥讨论建造者模式,我还是决定写一篇博客记录一下自己对建造者模式的理解,各位可以提出不同的观点,相互交流1:Builder 设计模式1.1:为什么要用建造者模式1.2:建造者模式的几个角色1.3:一款软件产品的建造过程2:变种 Builder

2017-07-08 00:32:12 1745 1

原创 屁股决定脑袋,思想决定高度

转眼不知不觉来到新公司近三个月了最近看欢乐颂安迪说的有句话很好,每一个管理者并不在乎你因为什么客观原因导致没完成任务,他更在乎交给你什么任务。你完成的结果如何。是啊,我们在职场与其抱怨这个任务是因为什么原因导致流产,不如多想想解决办法。作为员工我们更应该想想对方有什么需求,然后在实际进行中多从这些方面思考解决方案。1欢乐颂安迪的话引起设计模式的思考1.1单一职责原则1.2开闭原则1.3里矢替换

2017-06-11 17:09:17 6800

原创 江南带你看EventBus解说篇

订阅(注册):EventBus的EventBus.getDefault().register(this);就是便利当前类的所有方法,寻找以onEvent开头的放大,以键值队的形式存储。 发布:EventBus.getDefault().post(param);发布很简单就是调用这个方法,然后EventBus就会在内部存储的方法中扫描,找到参数匹配的就会调用反射去执行,它的内部就是维持一个Map集合

2017-03-09 10:06:52 380 1

原创 技能概括

1java中常见的io流1.1字节流1.2字符流1.3字节流如何转换为字符流?1.4字符流和字节流的区别?2说说你对反射的理解反射3说说你对泛型的理解4android的四大组件5熟悉ListView recycleView基本优化6多线程以及AyscTask内部机制7 熟悉使用JNI 8简述事件分发机制9 熟练掌握(数据)图片缓存机制以及Imageloader ,Glide,

2017-03-08 11:45:54 751

原创 单例设计模式总结

1为什么要用单例设计模式2几种单例设计模式2.1懒汉式2.1.1双重校验锁并不能保证安全2.1.2,使用volelite关键词2.1.3,ThreadLocal修复双重检测2.2最安全的单例-饿汉式3枚举单例1为什么要用单例设计模式        在我们开发过程中有时候对于某个类的实例只能有一个,也就是说该类只能被创建一次,别人想用只能用这个实例。这个在我们数据库的操作就是单例的一个体

2017-03-06 17:33:47 365

原创 建造器模式(builder)

1为什么要用builder设计模式?1.1普通对象的创建1.2builder链式调用的好处2应用的场景3感悟为什么要用builder设计模式? 在我们开发中我们可能经常写这种代码 Person person = new Person("jiangnan","25","school","sh");这种方式创建对象在属性不是很多的时候没感觉有什么别扭,假如现在随着业务的扩大,属性增加到几十个,

2017-03-06 16:06:31 565

原创 深入理解Volatile,synchronized,原子操作的必要性

1多线程问题1.1为什么要使用Volatile?1.2:竞态条件触发?1.3:内存可见性?]1.4多线程中堆,栈的分布2:java中的内存分配3:一个锁引发的问题多线程问题为什么要使用Volatile?为什么要使用Volatile?搞清楚这个问题先看一个情形。如果线程 A 对对象中的某个变量进行修改后还没来得及写回主存,线程 B 也对该变量进行了修改,那最后刷新回主内存后的值一定和期望的

2017-03-04 11:42:29 495

原创 带你从源码解析EventBus

1EventBus的使用2源码分析3方法的权限符EventBus的使用//注册订阅者 //如何获取EventBus对象 第一种方式:推荐 EventBus.getDefault().register(this);//第一种方式获取EventBus对象 这种方式是通过系统的方式单例获取一个EventBus对象public static EventBus getDefault() {

2017-03-03 15:39:54 1415

原创 开发中遇到的并发和数据库问题

1并发问题1.1:一个状态修改引起的问题1.2:本地和服务器因为同一个状态撕咬后的解决方案2数据库问题2.1:一个状态修改引起的问题2.2:安卓能支持Sqlite多线程操作吗2.3:临时文件的产生与解决2.4:数据库主键的选择2.4:为什么要加索引并发问题一个状态修改引起的问题        就是我们本地做了同步和异步两种操作,每个操作都会牵扯到对某个状态的修改,判断,展示。除此之外,

2017-03-03 11:11:57 1372

原创 工作第三周:之前的随笔

1:几个需求1.1:假如我们只有两个activity,如何实现界面跳转1.2:okhttp支持HTTPS怎么配置1.3:activity管理栈的好处2: 什么是4k对齐,android打包过程术3:如何判断某个view是否是在界面可见几个需求:假如我们只有两个activity,如何实现界面跳转       假如界面现在需要只能有两个activity,那么也想实现界面的跳转该怎么做?如果用f

2017-03-02 21:05:17 376

原创 Android性能优化—不建议使用枚举Enum

最近优化App,由于项目中使用了Lib,而Lib代码中包含了大量的枚举类型,导致App占用内存过多发火。好吧,知道问题点,那就干掉,抛弃之~偷笑问题是解决了,为啥会这样呢?疑问 先来看看Android官网的说明吧:看见了吧,Android官网不建议咱们使用enums,说的也很清楚了,占用内存多(Enums often require more than twice as much memory as

2017-03-02 15:44:45 2005

原创 Dragger2与MVP与Retrofit实战

1:MVP模块1.1:MVP与MVC区别,有何应用场景1.2如果写mvp2:dragger2框架2.1:为什么要用dragger2?2.2:深入解析dragger2?2.3:dragger2的使用3:retrofit的使用MVP模块MVP与MVC区别,有何应用场景      在我们传统的mvc开发中经常会遇到M(javabean),V(layout,activity),C(acti

2017-03-02 11:48:30 1275

原创 工作第二周:

一眨眼又过了一周,发生了很多事,一直想总结一下,只好拖到今天了。1跟娜娜确定恋爱关系2技术上的收获3总结1:跟娜娜确定恋爱关系      说起来跟娜娜的认识充满了机缘巧合,阴差阳错,这里就不赘述了,娜娜也是双子座,当我们交换了人生态度,发现对很多事物有着惊人的契合,甚至我一度产生一种感觉,觉着她就是我一直等待的那个人,遇到娜娜之前,我一直以为这辈子不会遇到这样让我心动想要照顾一生的女孩,那

2017-02-16 15:56:09 298

原创 2017年上班第一周:想起《嘿,老头!》里黄磊一句话:那生活也不能只靠回忆啊,那还得继续啊,总得活下去啊

转眼已经是来上海的第三个年头,新的一年,继续潜行1.1参加同学婚礼1.2走亲戚1.3感悟2学习的新技术1.1参加同学婚礼       我跟小林子认识大概是在2009年,距离现在已经八九个年头,要不是这次他老婆问我们俩既不是同班同学,仅仅是同年级不同班的,那是怎么认识的,我俩仿佛都忘了到底是怎么认识的,细细追溯,当初高二的时候我们一起参加的全国奥林匹克竞赛,当时他坐在我旁边,十七八岁的年纪

2017-02-07 14:51:28 568

原创 开发中不经意的自动拆装箱影响性能问题

在我们开发中会经常用到基本类型的包装类,但是我们很少会去考虑使用过程中带来的问题下面看一个例子:例子demo源码分析原因总结 问题1:为什么integer j=127;integer j2=127; j==j2,却integer k=128;integer k2=128,k!=k2?带着这个问题我们看下demopublic class Demo2 { public static

2017-01-16 15:44:36 925

原创 重写与重载编译时运行时不同之处

在我们平时在java基础学习到多态的时候我们知道一个父类引用指向子类对象的时候,编译时看父类,运行时看子类。那么抱着这个认识看下下面这个demo,以及给你带来怎么样的思考?先看Demo图片解释总结     public class Demo3 {public static String classmodify(Set<?> s){ return "set";}public

2017-01-16 15:09:43 3168 1

原创 grade那些事

我的gradle配置参数 在gradle.properties中会配置这些参数 org.gradle.daemon=true org.gradle.parallel=true org.gradle.jvmargs=-Xmx2048m构建初始化的很多工作是关于java虚拟机的启动,加载虚拟机环境,加载class文件等,如果这些动作交给一个d单独的后台进程去做,那么,第一次初始化之后的

2017-01-16 14:22:56 372

原创 我们手指触碰屏幕都做了什么?

1:首先我自定义一个LinearLayout,和TextView,重写它们的onInterceptTouchEvent和onTouchEvent方法,观察它们都返回值。 前者onInterceptTouchEvent是在ViewGroup里面定义的,android里的布局类一般都会继承此类。 onInterceptTouchEvent是用于拦截手势事件的,每个手势事件都会先调用onInterce

2016-07-18 21:02:41 1009

原创 江南带你从源码看handler内部实现的机制

介绍handler之前首先我们来看下ThreadLocal类的用法private static ThreadLocal<String> sthread; public static void main(String[] args) { sthread = new ThreadLocal<>(); sthread.set("这是我的第一个项目"); show

2016-05-08 00:51:01 2583 2

原创 handler的内存泄漏问题

Handler的内存泄漏的问题?所谓的内存泄漏就是这个对象没有任何使用价值了但是由于任然存在引用导致内存被占用了垃圾回收器回收不了。。。。。 至于为什么会出现内存泄漏呢? 这里面的原理是很深很深的,因为new 的handler是一个内部类对象对外部类对象有个隐试强引用。 内部类对外部类有个隐试强引用其实并没有导致内存泄漏,尽管activity的引用被内部类对象持有着,大不了内部类对象先被回收,

2016-05-08 00:34:55 901

原创 IntentService从源码解析

子线程的生命周期就是run方法结束了就结束了,这个我要说的一点就是HandlThread类,这里是由于quene.next()一直监听着消息队列,处于堵塞状态,所以这个线程是创建了就一直存在的。案例说安卓的主线程run方法执行完了也就该退出,由于安卓的主线程是一个特殊的线程所以一直存在。 下面我们看下曾经写过的一个主线程给子线程的发送的案例 protected void onCreate

2016-05-03 22:59:43 328

原创 Asynctask的解析

public static final Executor SERIAL_EXECUTOR = new SerialExecutor(); private static final int MESSAGE_POST_RESULT = 0x1; private static final int MESSAGE_POST_PROGRESS = 0x2; private static final

2016-05-03 19:30:48 385

原创 江南带你从源码教你解析Volley

sdas

2016-05-02 23:08:06 1465

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除