并发的学习与使用系列 第八篇

AQS是AbstractQueuedSynchronizer的简称,是并发组件包java.util.concurrent也就是JUC(Java Util Concurrency)的核心,以及很多并发组件如前面几篇中介绍到的ReentrantLock,Condition,BlockingQueue以及线程池里使用的worker等都是基于其实现的,将很多复杂的,繁琐的并发控制过程封装起来,便于其他并发工具类来实现更多,方便的功能,其主要通过volatile和UnSafe类的原子操作(Atomic相关)来实现阻塞和同步,这里通过ReentrantLock来分析下AQS的实现原理。

阅读全文

关于Java GC的理解

发布在 JVM

关于Java垃圾回收机制,网上介绍的资料很多,一般都是一些固定的知识,这些在书上都能找到相应的出处,这里希望讲一些更加细节的问题。如果你对Java虚拟机的知识不了解,建议先去了解一下,这里都是一些概念上的理解,主要基于HotSpot虚拟机。

GC(Garbage Collection)的发生时机

总体来说是内存使用紧张的时候会进行GC,即新对象所需连续内存(一般也就是所剩内存)比剩下的内存大时发生。

  1. young GC:当young gen中的eden区分配满的时候触发。注意young GC中有部分存活对象会晋升到old gen,所以young GC后old gen的占用量通常会有所升高。
  2. full GC:当准备要触发一次young GC时,如果发现统计数据说之前young GC的平均晋升大小比目前old gen剩余的空间大,则不会触发young GC而是转为触发full GC(因为HotSpot VM的GC里,除了CMS的concurrent collection之外,其它能收集old gen的GC都会同时收集整个GC堆,包括young gen,所以不需要事先触发一次单独的young GC);或者,如果有perm gen的话,要在perm gen分配空间但已经没有足够空间时,也要触发一次full GC;或者System.gc()、heap dump带GC,默认也是触发full GC。
阅读全文

已经有那么多的天气应用了,这个项目有什么不一样的地方吗?为什么还要做这个项目呢?

  • 第一个目的是熟悉项目从0到上线的过程,平常的工作中大部分是在做很小部分的业务开发,对项目的整体框架没机会实践。
  • 熟悉新的框架和技术,先进行应用,感受其优缺点,然后应用到工工作中,因为很多新技术学习是需要时间的,而且其特性也是需要提前了解的,在未了解的情况直接用到公司的项目会花费时间并且可能会带来风险。
  • 想做自己想用的东西。就像去年做NBAPlus时一样,当初是就想找一款只是纯粹的NBA资讯,新闻的应用。但找的效果都不好,于是就自己做了,顺便了解了服务器开发知识,把以前想学的python也学了。【知天气】也一样,我就想只是简单看看天气,而不是各种乱七八糟的广告,和各种通知,而且界面应该尽量美观,我找不到,所以就想着自己来做了,然后同时node.js搭建了server,通过一些开放的接口拼接成自己想要的天气信息,然后为应用提供接口(由于当初没想到要开源,所以有些天气信息没有提供,比如湿度等,后续会提供更多的信息)。
阅读全文

这是知天气实践中的架构搭建方式,建议先下载应用【应用宝,或腾讯bugly分发平台】体验下,以免浪费你的时间O(∩_∩)O~~。

项目的构架搭建过程包括MVP的使用,MVP使用中P层的组织,Model层的管理,以及划分P层和Model层的理解。除了项目的框架部分,结构分包方式也很重要,一个好的分包方式能让项目更加清晰,开发过程也会更有效率。除此之外,再加上一些第三方开源框架就能很好的搭建出一个Android应用了。

阅读全文

Dalvik虚拟机如同其他Java虚拟机一样,在运行程序时首先需要将对应的类加载到内存中。而在Java标准的虚拟机中,类加载可以从class文件中读取,也可以是其他形式的二进制流。因此,我们常常利用这一点,在程序运行时手动加载Class,从而达到代码动态加载执行的目的。
只不过Android平台上虚拟机运行的是Dex字节码,一种对class文件优化的产物,传统Class文件是一个Java源码文件会生成一个.class文件,而Android是把所有Class文件进行合并,优化,然后生成一个最终的class.dex,目的是把不同class文件重复的东西只需保留一份,如果我们的Android应用不进行分dex处理,最后一个应用的apk只会有一个dex文件。

阅读全文

常见的设计模式学习

发布在 Java

OO基础

  • 抽象
  • 封装
  • 多态
  • 继承

面向对象的六大原则

  • 单一职责原则:一个类中应该是一组相关性很高的函数、数据的封装。
  • 开闭原则 : 软件中的对象(类、模块、函数等)应该对扩展开放,对修改关闭。
  • 里氏替换原则 : 所有引用基类的地方必须能透明地使用其子类对象
  • 依赖倒置原则 : 模块间的依赖通过抽象产生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的。
  • 接口隔离原则 : 客户端不应该依赖它不需要的接口,类之间的依赖关系应建立在最小的接口上。
  • 最少知识原则 : 一个对象应该对其他对象有最少的了解。
    上述原则是一种理想化的情况,实际开发中应朝着这个方向去做。以上原则会在接下来的模式中实践
阅读全文

在学习Android过程中,会使用到很多开源框架,而使用时对框架的实现方式应有一定的了解,这个过程最好的方式就是阅读源码,毕竟源码说明一切。但开源框架很多,不时会有新的出现,而且对一些通用框架来说,一般代码量非常庞大,所以正确的阅读姿势很重要。一般来说有下面几个要点:

  • 明确阅读源码的目的是对整体有个了解而非细节,对开源框架来说就是先找这个框架的特点,其他相同业务框架相比的优点和不足,这也是选择的考虑的重点;
  • 厘清一个框架的核心点和辅助点;
  • 最重要的是总结相似框架的架构模式与习惯,慢慢的就会有一套自己的阅读套路。

这里主要通过常用的网络请求库OkHttp,图片加载库Picasso,事件总线库EventBus等对上面提到的几点进行解读。

阅读全文

项目地址:Router

代理模式的学习与应用介绍了代理模式的原理及简单使用方式,Router就是基于此实现了一个Android间组件、线程间方便通信的库。

项目背景

在Android中的,EventBus是开源最流行的事件总线库,大大简化了应用程序内各组件间、组件与后台线程间的通信。之前的个人项目NBAPlus也是使用EventBus来简化开发,但在使用过程中有一些问题。

阅读全文

前段时间在研究插件化,其中主要看了任玉刚动态加载框架——dynamic-load-apk,其Activity的注册问题主要是通过静态代理的方式来完成,之前了解过代理模式,但具体没使用过,这次看到了具体的使用,于是更深入的去学习静态代理,以及动态代理。

本篇主要讲静态代理和JDK的动态代理的原理,也是Router——一种Android中使用的高效、方便的事件总线解耦库实现的主要原理。

阅读全文

关于Activity,Window,View的关系一直有个模糊的印象,看别人的分析一般都这么理解Activity是管理Window,Window用来承载View,View是最终的视图,也有说Window的作用可有可无的,作用并不大的,并不是说这些观点有问题,而是看了这么多后,会更迷惑,管理是怎么管理的,承载是怎么实现的,如果不自己根据源码看一些,这些概念会一直是抽象的,遇到问题还是没法理解,例如:

1 . 在Activity里调用

1
2
WindowManager.LayoutParams wl = new WindowManager.LayoutParams();
getWindowManager().addView(mView,wl);

1
2
LayoutParams wmParams =...
addContentView(mView,wmParams); //activity里的方法

这两种方式背后的实现是怎样的,有什么区别?

阅读全文

SilenceDut

talk is cheap,here are my blog


Android engineer


广东,广州