您的位置:首页 > 移动开发 > Android开发

Android 内存优化项目

2016-04-15 07:49 435 查看
项目地址 MemoryBugs

首先来看主要代码,了解代码整体逻辑:

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的提示,进行修改:



由于完成作业时间较晚,参考了很多同学的思路和见解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: