技术文章整理 + 心得

Android 基础

Android 五大布局介绍
https://www.jianshu.com/p/4fac6304d872
FrameLayout,LinearLayout,RelativeLayout,TableLayout,AbsoluteLayout(弃)

Android Studio 调试

断点调试
http://blog.csdn.net/yy1300326388/article/details/46501871

  1. 其中的“跨断点调试”应为“恢复项目”;
  2. 学会灵活运用“设置变量的值”功能;

TraceView 性能分析
https://bxbxbai.github.io/2014/10/25/use-trace-view/

  1. 最重要的两个参数是 Calls + Recur Calls / Total 和 Cpu Time / Call;
  2. 在开始追踪的地方加入 Debug.startMethodTracing(“name”);,在停止追踪的地方加入 Debug.stopMethodTracing();,即可生成用于 TraceView 分析的 debug 文件;
Android 新特性

Android 8 新特性
https://zhuanlan.zhihu.com/p/26409511

通知渠道,画中画模式,自适应图标,固定快捷方式和小部件….

Android 性能

Android 中 RelativeLayout 和 LinearLayout 的性能分析
http://www.jianshu.com/p/8a7d059da746

  1. RelativeLayout 默认执行两次 onMeasure:因为 View 有可能在横纵方向存在交叉引用(A 横方向依赖 B,B 纵方向依赖 A);
  2. LinearLayout 默认执行一次 onMeasure;如果使用 weight 属性,则执行两次 onMeasure,即非 weight 属性先 onMeasure 一次,剩下的长度再分配给 weight 属性;
  3. 尽量使用 padding 代替 margin;
  4. 复杂的 View 嵌套结构对性能的影响更大;
Android 代码质量

SonarQube
https://www.sonarqube.org/

代码质量管理平台;

Android 插件化

Android 插件化入门
http://www.jianshu.com/p/b6d0586aab9f

Android 插件化的作用:

  1. 解决方法数超过65535的问题;
  2. 不同团队负责不同的插件,分工明确;
  3. 不同模块封装成不同的插件 APK,各个模块可以单独编译,提高开发效率;
  4. 通过上线新的插件解决线上 bug,实现“热修复”;
  5. 减小宿主 APK 的体积;
Android Web

Android 代码混淆
https://www.cnblogs.com/renhui/p/5863199.html
http://www.cnblogs.com/renhui/p/5910300.html(Java Annotation)

使用 Js 的 WebView 都要进行代码混淆;

Android 开发技巧

获取当前 Activity 实例对象
http://blog.csdn.net/vfush/article/details/51483436

  1. 在 MyApplication 内声明公有静态 Activity 对象 sCurrentFrontActivity;
  2. 在 MyApplication 内重写 onCreate 方法,实现 ActivityLifecycleCallbacks 接口,在 onActivityCreated 和 onActivityResumed 方法中为 sCurrentFrontActivity 赋值为参数 activity;
  3. 使用时,判断 (MyApplication.sCurrentFrontActivity instanceof 某个 Activity),reture true 则当前 Activity 为那个 Activity;
    (不一定是最好的解决方案!)

Android 屏幕适配:最全面的解决方案
https://www.jianshu.com/p/ec5a1a30694b

仅收藏,暂无研究的动力;

漏洞:startForeground() 前台 Service 去掉通知显示
http://blog.csdn.net/wxx614817/article/details/50669420

Android 7.0 已经修复该漏洞;

Android 常见错误

java.util.ConcurrentModificationException
http://blog.csdn.net/aaawqqq/article/details/43884623

出现原因:集合在被迭代器迭代的同时被修改;
解决方法:
1. 迭代时用锁;
2. 先复制,再迭代;
3. Android 使用 CopyOnWriteArrayList;

Android 源码

深入理解 Looper,Handler,Message
http://blog.csdn.net/lmj623565791/article/details/38377229
http://blog.csdn.net/shaoenxiao/article/details/54561753
异步消息处理机制

Android 生命周期 & 适合执行的操作
http://blog.csdn.net/samuel__liu/article/details/51049579

  1. A Activity 中启动 B Activity,生命周期的执行顺序:
    A Activity -> onPause();
    B Activity -> onCreate();
    B Activity -> onStart();
    B Activity -> onResume();
    A Activity -> onStop();
  2. onCreate() 中建议进行 setContentView(),findViewById() 等初始化操作
  3. onResume() 可以进行耗时操作,但不是 Activity 可交互最好的指示器,使用 onWindowFocusChanged() 可以更清楚知道 Activity 的交互情况;
  4. onPause() 不能进行耗时操作(如果执行时间超过 500ms,Activity 将会被强制关闭),但是需要执行如停止动画等消耗 CPU 的操作,以便下一个 Activity 更快执行;或执行关闭独立设备(如照相机)的操作;
  5. onStop() 可以进行耗时操作,因为它是在后台执行;然而,如果内存不足,系统可能回收此进程,onStop() 可能永远不会执行;

Activity 与 Fragment 生命周期比较
这里写图片描述

Android 架构

Android MVP 讲解(晓鹏)
https://rocko.xyz/2015/02/06/Android%E4%B8%AD%E7%9A%84MVP/

MVP 对应于 Android:
M:Model,V:Activity,P:Presenter
其中,Activity 持有 Presenter 的引用,Presenter 持有 Model 和 Activity 的引用;

Android MVP demo
https://github.com/iGuure/AndroidCodeHub/tree/master/AndroidArchitecture

软引用 弱引用 ReferenceQueue WeakHashMap

Java 四种引用介绍
https://www.cnblogs.com/dolphin0520/p/3784171.html

  1. 软引用很适合做缓存;
  2. 与 ReferenceQueue 联用时,ReferenceQueue.poll 拿到的是引用,此时调用该引用的 get 方法返回 null(对象将要被回收);
  3. 调用 System.gc 无法保证 JVM 立即执行垃圾回收;

ReferenceQueue 介绍
https://www.cnblogs.com/dreamroute/p/5029899.html
(读到 WeakHashMap 之前)

  1. 例子中的 referenceQueue.remove 改为 referenceQueue.poll,去掉 thread.setDaemon(true),System.out.println(“map.size->” + map.size()) 移到子线程的最后;

WeakHashMap 介绍
https://www.cnblogs.com/skywang12345/p/3311092.html

  1. 我的理解:HashMap.put 直接将 key 的引用存进键中,WeakHashMap.put 为 key 对象新增一条弱引用,并将弱引用存进键中,如图:

WeakHashMap 介绍

轮子:SoftMap
http://blog.csdn.net/lovoo/article/details/51302594

指针和引用

C++ 中指针和引用的区别
https://www.cnblogs.com/dolphin0520/archive/2011/04/03/2004869.html
(只读1.(1))

  1. 我的理解(以 Java 为例):
Integer i = new Integer(1);

此时内存栈中存放着引用 i,堆中存放着 Integer 对象 1:
指针 是堆中 Integer 对象 1 在内存中的地址,
引用 是栈中引用 i 或 i 的别名;

内部类

普通内部类和静态内部类的区别
http://blog.csdn.net/u012123938/article/details/46684839

  1. 普通内部类持有对外部类的强引用;静态内部类则没有,可以使用软引用或弱引用访问外部类(Android handler 内存泄漏:链接);
  2. 普通内部类不能持有静态成员;
Java 语法

普通代码块,构造代码块,静态代码块
https://www.cnblogs.com/sophine/p/3531282.html

  1. 三种代码块均没有方法名,注意各自的位置和关键词;

  2. 普通代码块功能与一般大括号相同;
    构造代码块每次初始化类时都运行一次;
    静态代码块只在 JVM 初次加载类时运行一次;
Java 多线程

Java 实现超时监听
http://blog.csdn.net/dailywater/article/details/19771689

方案1:使用守护线程;
方案2:使用 Future 特性(推荐);

// Android 范例代码
ExecutorService executorService = Executors.newCachedThreadPool();
Future<String> future = executorService.submit(new TimerTask());
try {
    future.get(5000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
    e.printStackTrace();
} catch (ExecutionException e) {
    e.printStackTrace();
} catch (TimeoutException e) {
    Log.d("Guu", "Time out!");
    e.printStackTrace();
}
Log.d("Guu", "Finish future task!");

class TimerTask implements Callable<String> {
    @Override
    public String call() throws Exception {
        Thread.sleep(10000);
        return null;
    }
}

Condition
http://blog.csdn.net/ghsau/article/details/7481142

传统的 notify() 不能指定唤醒哪一个 wait(),而 Condition 的 await() 可以唤醒特定的 signal();

Volatile
https://www.cnblogs.com/zhengbin/p/5654805.html

Volatile 的作用:
1. 保证变量对所有线程的可见性;
2. 禁止指令重排列(保证 Volatile 前后的语句相对位置不变);

网络

HTTP 1.0/1.1/2.0
http://www.jianshu.com/p/52d86558ca57

其他

Json 相较于 XML 的优势
https://www.zhihu.com/question/25636060

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值