郭霖大神的6篇博客笔记汇总

Android状态栏微技巧,带你真正理解沉浸式模式   http://blog.csdn.net/guolin_blog/article/details/51763825

Android弹幕功能实现,模仿斗鱼直播的弹幕效果    http://blog.csdn.net/guolin_blog/article/details/51933728
其实并不复杂,我们只需要首先在布局中放置一个显示游戏界面的View,然后在游戏界面的上方再覆盖一个显示弹幕的View就可以了。
弹幕的View必须要做成完全透明的,这样即使覆盖在游戏界面的上方也不会影响到游戏的正常观看,只有当有人发弹幕消息时,
再将消息绘制到弹幕的View上面就可以了。


Android新特性介绍,ConstraintLayout完全解析  http://blog.csdn.net/guolin_blog/article/details/53122387
ConstraintLayout和传统编写界面的方式恰恰相反,ConstraintLayout非常适合使用可视化的方式来编写界面。
ConstraintLayout还有一个优点,它可以有效地解决布局嵌套过多的问题。ConstraintLayout则是使用约束的方式来指定各个控件的位置和关系的。


Android Studio新功能解析,你真的了解Instant Run吗?  http://blog.csdn.net/guolin_blog/article/details/51271369
Instant Run主要分为三种类型,hot swap、warm swap和cold swap,Android Studio会根据代码的修改情况自动选择使用哪种swap类型。

Android冷启动白屏解析,带你一步步分析和解决问题  http://blog.csdn.net/guolin_blog/article/details/51019856
1.其实并不是2.0.0版本的gradle插件不支持Instant Run,而是因为我当前使用的是2.1版的Android Studio,它和2.0.0版本的gradle插件在Instnat Run功能方面不兼容。如果你是使用的2.0版本的Android Studio,那么你会发现2.0.0版本的gradle插件也是支持Instant Run的。
2.这样我们基本就把问题的原因定位出来了,支持Instant Run功能的时候就会出现长时间白屏的情况,不支持Instant Run功能的时候就一切正常,看来罪魁祸首果然还是Instant Run呀。
3.但是大家有没有想过Instant Run是用来做什么的?是用来提升开发效率的,没错,就是开发效率!也就是说,只有在开发阶段才会有Instant Run这个东西,在正式的产品中是完全不存在Instant Run的!
4.如果你的观察力非常敏锐的话,应该能发现其实我们的程序还是会经历一个白屏的阶段,只不过非常短,瞬间就跳过了。
这个就和Instant Run无关了,这是由于在启动的时候程序都要进行一些基本的初始化操作,所有程序都是要经历这个过程的。
解决办法: <item name="android:windowIsTranslucent">true</item>
           <item name="android:windowNoTitle">true</item>


Android Context完全解析,你所不知道的Context的各种细节  http://blog.csdn.net/guolin_blog/article/details/47028975
1.绝大多数场景下,Activity、Service和Application这三种类型的Context都是可以通用的。
不过有几种场景比较特殊,比如启动Activity,还有弹出Dialog。出于安全原因的考虑,
Android是不允许Activity或Dialog凭空出现的,一个Activity的启动必须要建立在另一个Activity的基础之上,
也就是以此形成的返回栈。而Dialog则必须在一个Activity上面弹出(除非是System Alert类型的Dialog),
因此在这种场景下,我们只能使用Activity类型的Context,否则将会出错。

2.Context数量 = Activity数量 + Service数量 + 1  

3.getApplication()和getApplicationContext()方法的区别:getApplication()方法的语义性非常强,一看就知道是用来获取Application实例的,但是这个方法只有在Activity和Service中才能调用的到。那么也许在绝大多数情况下我们都是在Activity或者Service中使用Application的,但是如果在一些其它的场景,比如BroadcastReceiver中也想获得Application的实例,这时就可以借助getApplicationContext()方法了

4.ContextImpl正是上下文功能的实现类。也就是说像Application、Activity这样的类其实并不会去具体实现Context的功能,而仅仅是做了一层接口封装而已,Context的具体功能都是由ContextImpl类去完成的。
其实所有ContextWrapper中方法的实现都非常统一,就是调用了mBase对象中对应当前方法名的方法。mBase对象就是ContextImpl对象


Android drawable微技巧,你所不知道的drawable的那些细节  http://blog.csdn.net/guolin_blog/article/details/50727753
1.对于每种密度下的icon应该设计成什么尺寸其实Android也是给出了最佳建议  
mipmap-mdpi 48*48   
mipmap-hdpi 72*72   
mipmap-xhdpi   96*96 
mipmap-xxhdpi    144*144
mipmap-xxxhdpi    192*192

2.mdpi密度的最高dpi值是160,而xxhdpi密度的最高dpi值是480,因此是一个3倍的关系,那么我们就可以猜测,
放到drawable-mdpi文件夹下的图片在xxhdpi密度的设备上显示会被放大3倍。



Android状态栏微技巧,带你真正理解沉浸式模式   http://blog.csdn.net/guolin_blog/article/details/51763825



    












http://blog.csdn.net/guolin_blog/article/details/42238627  Android最佳性能实践(一)——合理管理内存


(1)节制地使用Service:当我们启动一个Service时,系统会倾向于将这个Service所依赖的进程进行保留。Android官方推荐的最佳解决方案就是使用IntentService,这种Service的最大特点就是当后台任务执行结束后会自动停止。


(2)当界面不可见时释放内存:那么我们如何才能知道程序界面是不是已经不可见了呢?其实很简单,只需要在Activity中重写onTrimMemory()方法,然后在这个方法中监听TRIM_MEMORY_UI_HIDDEN这个级别,一旦触发了之后就说明用户已经离开了我们的程序,那么此时就可以进行资源释放操作了


(3)当内存紧张时释放内存:当内存紧张时释放内存


(4)避免在Bitmap上浪费内存:当我们读取一个Bitmap图片的时候,有一点一定要注意,就是千万不要去加载不需要的分辨率


(5)使用优化过的数据集合:Android API当中提供了一些优化过后的数据集合工具类,如SparseArray,SparseBooleanArray,以及LongSparseArray等


(6)知晓内存的开支情况:使用枚举通常会比使用静态常量要消耗两倍以上的内存,在Android开发当中我们应当尽可能地不使用枚举。
 任何一个Java类,包括内部类、匿名类,都要占用大概500字节的内存空间。
 任何一个类的实例要消耗12-16字节的内存开支,因此频繁创建实例也是会一定程序上影响内存的。
 在使用HashMap时,即使你只设置了一个基本数据类型的键,比如说int,但是也会按照对象的大小来分配内存,大概是32字节,而不是4字节。因此最好的办法就是像上面所说的一样,使用优化过的数据集合。
(7)谨慎使用抽象编程:因为抽象的编程方法需要编写额外的代码,虽然这些代码根本执行不到,但是却也要映射到内存当中


(8)尽量避免使用依赖注入框架:但是这些框架为了要搜寻代码中的注解,通常都需要经历较长的初始化过程


(9)使用ProGuard简化代码:很多人都会使用这个工具来混淆代码,但是除了混淆之外,它还具有压缩和优化代码的功能


(10)使用多个进程:这个技巧其实并不是非常建议使用,但它确实是一种可以帮助我们节省和管理内存的高级技巧。


http://blog.csdn.net/guolin_blog/article/details/42238633   Android最佳性能实践(二)——分析内存的使用情况
(1)上图当中,每个蓝色的圆圈就代表一个内存当中的对象,而圆圈之间的箭头就是它们的引用关系。这些对象有些是处于活动状态的,而有些就已经不再被使用了。那么GC操作会从一个叫作Roots的对象开始检查,所有它可以访问到的对象就说明还在使用当中,应该进行保留,而其它的对象就表示已经不再被使用了
(2)那么怎样才能去监听系统的GC过程呢?其实非常简单,系统每进行一次GC操作时,都会在LogCat中打印一条日志,我们只要去分析这条日志就可以了
(3)最后Pause_time表示这次GC操作导致应用程序暂停的时间。关于这个暂停的时间,Android在2.3的版本当中进行过一次优化,在2.3之前GC操作是不能并发进行的,也就是系统正在进行GC,那么应用程序就只能阻塞住等待GC结束。虽说这个阻塞的过程并不会很长,也就是几百毫秒,但是用户在使用我们的程序时还是有可能会感觉到略微的卡顿。而自2.3之后,GC操作改成了并发的方式进行,就是说GC的过程中不会影响到应用程序的正常运行,但是在GC操作的开始和结束的时候会短暂阻塞一段时间,不过优化到这种程度,用户已经是完全无法察觉到了。
(4)点击Update Heap按钮。。。然后继续点击Cause GC按钮,如果你发现反复操作某一功能会导致应用程序内存持续增高而不会下降的话,那么就说明这里很有可能发生内存泄漏了。
(5)导致内存泄漏最主要的原因就是某些长存对象持有了一些其它应该被回收的对象的引用,导致垃圾回收器无法去回收掉这些对象,那也就出现内存泄漏了。


(6)我们应该怎么定位到具体是哪里出的问题呢?这就需要借助一个内存分析工具了,叫做Eclipse Memory Analyzer(MAT)。首先还是进入到DDMS界面,然后在左侧面板选中我们要观察的应用程序进程,接着点击Dump HPROF file按钮,如下图所示:
(7)MAT的使用方法:Histogram可以列出内存中每个对象的名字、数量以及大小。
Dominator Tree会将所有内存中的对象按大小进行排序,并且我们可以分析对象之间的引用结构。


http://blog.csdn.net/guolin_blog/article/details/42318689   Android最佳性能实践(三)——高性能编码优化
(1)避免创建不必要的对象:如果我们有一个需要拼接的字符串,那么可以优先考虑使用StringBuffer或者StringBuilder来进行拼接,而不是加号连接符。在没有特殊原因的情况下,尽量使用基本数据类来代替封装数据类型,int比Integer要更加高效,其它数据类型也是一样。
(2)静态优于抽象:如果你并不需要访问一个对象中的某些字段,只是想调用它的某个方法来去完成一项通用的功能,那么可以将这个方法设置成静态方法
(3)对常量使用static final修饰符
(4)使用增强型for循环语法
(5)多使用系统封装好的API:因为使用系统的API在很多时候比我们自己写的代码要快得多,它们的很多功能都是通过底层的汇编模式执行的。=
(6)避免在内部调用Getters/Setters方法


http://blog.csdn.net/guolin_blog/article/details/43376527   Android最佳性能实践(四)——布局优化技巧
(1)<include>标签:在<include>标签当中,我们是可以覆写所有layout属性的
(2)<merge>标签:<merge>标签是作为<include>标签的一种辅助扩展来使用的,它的主要作用是为了防止在引用布局文件时产生多余的布局嵌套。
(3)ViewStub:ViewStub虽说也是View的一种,但是它没有大小,没有绘制功能,也不参与布局,资源消耗非常低,将它放置在布局当中基本可以认为是完全不会影响性能的。




http://blog.csdn.net/guolin_blog/article/details/8986285  Java设计模式透析之 —— 策略(Strategy)    策略:它定义了算法家庭,分别封装起来。让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。


 Java设计模式透析之 —— 模板方法(Template Method)  http://blog.csdn.net/guolin_blog/article/details/8744002  模板方法: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。







  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值