public class CldMemoryOptiActivity extends Activity {
private MyHandlder mMyHandler = new MyHandlder();
class MyHandlder extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
// while (true) {
Log.i(CldMainUtil.TAG, "一直占用着Activity");
// }
}
}
MyClass myClass = new MyClass();
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.java_basic_detail_layout);
((TextView) findViewById(R.id.top_title)).setText("内存溢出的例子");
// ((TextView) findViewById(R.id.btn_detail_con)).setText(ex());
mMyHandler.sendEmptyMessageDelayed(0, 100000);
/**
* 测试Handler的结果:比如延迟100000ms发送,来回切换此界面,内存是会一直增加,但是过了100S之后。内存感觉像是降下来了??
* 难道内存回收了???
*/
}
class MyClass {
public MyClass() {
}
}
}
通过上面代码测试. 连续进入->返回->进入->返回->进入->返回多次之后:立马输出hprof文件查看,内存都没有释放。通过搜索CldMemoryOptiActivity查看结果如下:
过了2分钟之后,再次输出hprof文件查看结果,如图所示:
3. 手动点击eclipse的Cause GC之后,再次输出文件查看:
为什么???
重新写代码,采用弱应用的方式:
public class CldMemoryOptiActivity extends Activity {
private MyHandlder mMyHandler = new MyHandlder(this);
static class MyHandlder extends Handler {
WeakReference<CldMemoryOptiActivity> mWeakR;
public MyHandlder(CldMemoryOptiActivity mWeak) {
mWeakR = new WeakReference<CldMemoryOptiActivity>(mWeak);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
CldMemoryOptiActivity mOpti = mWeakR.get();
if (mOpti != null) {
Log.i(CldMainUtil.TAG, "一直占用着Activity");
}
}
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.java_basic_detail_layout);
((TextView) findViewById(R.id.top_title)).setText("内存溢出的例子");
mMyHandler.sendEmptyMessageDelayed(0, 100000);
/**
* 测试Handler的结果:比如延迟100000ms发送,来回切换此界面,内存是会一直增加,但是过了100S之后。内存感觉像是降下来了??
* 难道内存回收了???
*/
}
}
采用上面的方式重新测试:
同样没有释放,为什么????
难道是测试方式有问题???