测试Android应用程序中的内存泄漏

lwi*_*man 6 testing lifecycle android memory-leaks

我最近了解到泄漏上下文会浪费多少内存,以及如何在屏幕方向更改后使用内存转储测试此类泄漏.应该实例化和创建新活动,销毁和收集原始活动.但是,除非我泄漏内存并且没有看到它,否则如果它开始不同的活动并且自我毁灭,则下面的活动似乎不会被收集:

public class Foo extends Activity {
    private Button button;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        button = new Button(this);
        button.setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                startActivity(new Intent(Foo.this, Bar.class));
                finish();
            }
        });

        setContentView(button);
    }

    protected void onDestroy() {
        super.onDestroy();

        button.setOnClickListener(null);

        Log.e("you're it", "isFinishing() == " + isFinishing());
    }
}
Run Code Online (Sandbox Code Playgroud)

 

public class Bar extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        TextView textView = new TextView(this);
        textView.setText("hello, world");

        setContentView(textView);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是内存转储信息,在单击按钮以启动Bar并请求垃圾收集几次后获取:

Class Name                                               | Shallow Heap | Retained Heap
----------------------------------------------------------------------------------------
com.test.testProject.Foo @ 0x4135b188                    |          184 |         2,208
 mOuterContext android.app.ContextImpl @ 0x4135b390      |           96 |           392
  <Java Local> java.lang.Thread @ 0x40996460  main Thread|           80 |         1,416
  mContext android.media.AudioManager @ 0x4135b480       |           48 |           176
----------------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

基于,我认为在活动之间额外完成将使第一个符合收集条件并允许我以另外的方式测试泄漏,这是否合理?我是否泄漏记忆?是否有某些原因Android会想要保持这种被破坏的活动?

Sim*_*Sun 0

也许你可以尝试下面的代码:

 button.setOnClickListener(new OnClickListener() {
        public void onClick(View view) {
            startActivity(new Intent(getApplicationContext(), Bar.class));
            finish();
        }
    });
Run Code Online (Sandbox Code Playgroud)