Android 内存优化项目
2016-04-15 07:49
435 查看
项目地址 MemoryBugs
首先来看主要代码,了解代码整体逻辑:
startB()是开启一个新的Activity,startAllocationLargeNumbersOfObjects()是进行大量对象的创建。下面我们运行程序,使用工具进行分析
LeakMemory诊断的结果已经说明,mContent引起了内存泄漏。
回到代码进行下一步判断。
这里的静态变量是导致内存泄漏的原因,最简单的办法应该是取消static变量
- 2. 点击STARTALLOCATION按钮出现了内存抖动
然后查看代码:
for循环中一直在创建对象及字符串的拼接。
建议把rect放在onCreate中初始化。
- 3. 尤其重点要查看handler:
由于匿名接口Runnable持有了对当前Activity的引用,延时太久,会导致主线程无法释放。所以这里我们进行弱引用。
4.最后,根据Android studio的提示,进行修改:
由于完成作业时间较晚,参考了很多同学的思路和见解
首先来看主要代码,了解代码整体逻辑:
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static TextView sTextView; private Button mStartBButton; private Button mStartAllocationButton; Handler mHandler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { return false; } }); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); sTextView = (TextView) findViewById(R.id.tv_text); sTextView.setText("Hello World!"); mStartBButton = (Button) findViewById(R.id.btn_start_b); mStartBButton.setOnClickListener(this); mStartAllocationButton = (Button) findViewById(R.id.btn_allocation); mStartAllocationButton.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_start_b: startB(); break; case R.id.btn_allocation: startAllocationLargeNumbersOfObjects(); break; } } private void startB() { finish(); startActivity(new Intent(this, ActivityB.class)); mHandler.postDelayed(new Runnable() { @Override public void run() { System.out.println("post delayed may leak"); } }, 5000); Toast.makeText(this, "请注意查看通知栏LeakMemory", Toast.LENGTH_SHORT).show(); } private void startAllocationLargeNumbersOfObjects() { Toast.makeText(this, "请注意查看MemoryMonitor 以及AllocationTracker", Toast.LENGTH_SHORT).show(); for (int i = 0; i < 10000; i++) { Rect rect = new Rect(0, 0, 100, 100); System.out.println("-------: " + rect.width()); } }
startB()是开启一个新的Activity,startAllocationLargeNumbersOfObjects()是进行大量对象的创建。下面我们运行程序,使用工具进行分析
LeakMemory诊断的结果已经说明,mContent引起了内存泄漏。
回到代码进行下一步判断。
private static TextView sTextView;
这里的静态变量是导致内存泄漏的原因,最简单的办法应该是取消static变量
- 2. 点击STARTALLOCATION按钮出现了内存抖动
然后查看代码:
private void startAllocationLargeNumbersOfObjects() { Toast.makeText(this, "请注意查看MemoryMonitor 以及AllocationTracker", Toast.LENGTH_SHORT).show(); for (int i = 0; i < 10000; i++) { Rect rect = new Rect(0, 0, 100, 100); System.out.println("-------: " + rect.width()); } }
for循环中一直在创建对象及字符串的拼接。
建议把rect放在onCreate中初始化。
- 3. 尤其重点要查看handler:
mHandler.postDelayed(new Runnable() { @Override public void run() { System.out.println("post delayed may leak"); } }, 5000);
由于匿名接口Runnable持有了对当前Activity的引用,延时太久,会导致主线程无法释放。所以这里我们进行弱引用。
4.最后,根据Android studio的提示,进行修改:
由于完成作业时间较晚,参考了很多同学的思路和见解
相关文章推荐
- Android Native Binder
- Android Debuggerd 简要介绍和源码分析
- Android类动态加载技术
- Android MediaRecorder系统结构
- Android: 使用JitPack发布你的Github开源库
- Android Studio 2.0 download
- Android应用程序的组成部分
- android国际化
- Android开发中,有哪些让你觉得相见恨晚的方法、类或接口
- Android开发笔记之《JNI常用知识汇总》
- 关于android studio中装插件genymotion时遇到的一些问题
- Android 开发中的新技术
- 初步理解MVC与MVP
- android layout_weight 使用总结
- ORB_SLAM2在Android上的移植过程
- Android 版本
- 一个Demo学会用Android兼容包新控件
- Android遍历Cursor所有数据的正确姿势
- LruCache详解之 Android 内存优化
- Android中Service类onStartCommand