1、activity的泄露
(1)、如果你持有一个未使用的 Activity 的引用,其实也就持有了 Activity 的布局,自然也就包含了所有的 View。
(2)、最棘手的是持有静态引用(很危险)
Activity 和 Fragment 都有自己的生命周期。
一旦我们持有了静态引用,Activity 和 Fragment 就不会被垃圾回收器清理掉了。(m_staticActivity = staticFragment.getActivity()
)
2、泄漏 Listener
列如:activity单例
- public class LeakActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- NastyManager.getInstance().addListener(this);
- }
- }
/如果关闭activity销毁时单例没有解绑,会报错
正确的做法:单例中移除掉对 Activity 的引用
- @Override
- public void onDestroy() {
- super.onDestroy();
- NastyManager.getInstance().removeListener(this);
- }
3、内存泄漏—内部类(内部非静态类是不能脱离所属类而单独存活的)
在 Activity 里有一个很简短的非静态 Handler。
/只要它还存活着,那么包含它的 Activity 就会存活着
- public class MainActivity extends Activity {
- //...
- Handler handler;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- //...
- handler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- }
- }
- }
//解决:弱引用
垃圾回收器在回收的时候,是会忽视掉弱引用的,所以包含它的 Activity 会被正常清理掉。
///总结:
相比非静态内部类,最好使用静态内部类。区别就是静态内部类不依赖所属类
4、泄露总结:
•移除掉所有的静态引用。
•考虑用 EventBus 来解耦 Listener。
•记着在不需要的时候,解除 Listener 的绑定。
•尽量用静态内部类。
•做 Code Review。个人经验:Code Review 能很早的发现内存泄漏。
•了解你程序的结构。
•用类似 MAT,Eclipse Analyzer,LeakCanary 这样的工具分析内存。
•在 Callback 里打印 Log。
5、实现流畅滑动的技巧
///UI 线程只用作 UI 渲染、不做下列的事:
•载入图片
•网络请求 ( Volley,也可以试试 Square 的 Retrofit)
•解析 JSON (Jackson 以及 ig-json-parser)
•读取数据库 (Loader,支持批量更新和载入)
6、确定你是否在主线程的代码
Looper.myLooper() == Looper.getMainLooper()
7、并发 APIs
/App 快速响应请求
—-> Service 的方法是在 UI 线程执行的。请考虑使用 IntentService,AsyncTask,Executors,Handler 和 Loopers。
(1)、IntentService(不用更新UI)
IntentService 是一个单线程,一次一个任务的工作流
大型复杂的任务,而且这个任务不需要跟 UI 打交道(执行上传功能)
(2)、AsyncTask (更新 UI)
注意:当你旋转手机的时候,Activity 会被关闭,然后重启。不然可能造成内存泄露。
(3)、Executor Framework
默认是存在一个由系统管理的线程池,你可以通过 callback,future 来控制和管理。
8、避免使用废弃的 API
- •不要通过反射来调用私有 API。
- •不要再 NDK 和 C 语言层调用私有 Native 方法。
- •不要轻易调用 Runtime.exec 指令完成进程通讯功能。
- •adb shell am 做进程通讯并不好。
/避免使用:
用 Toolbar 而非 ActionBar,
在需要动画的时候用 RecyclerView,因为它专门为动画做过优化。
9、理解架构:
学习下 App 组件的生命周期。
比如什么是 Activity 的 Flag?
什么是 Fragment?
什么事 stated fragment?
什么是 task?
读读文档,尝试下用回调的 log 搞清楚这些概念。