Tuesday 20 August 2019

android - Why does EditText retain its Activity's Context in Ice Cream Sandwich



In Ice Cream Sandwich, when there's an Activity containing an EditText, the EditText will retain the Activity's Context even after the user leaves the Activity. To demonstrate this I've created TestLeakActivity, which allocates a large byte array. Since the Activity's Context is never garbage collected, the byte arrays accumulate on the heap, eventually causing an OutOfMemoryError. You can observe the heap growth by using the DDMS heap tool, and you can track the outstanding references to the EditText class by looking at the HPROF file in Eclipse MAT. To create memory leaks, go into LaunchActivity and just keep launching and backing out of TestLeakActivity.



LaunchActivity.java




package com.example.testleakproject;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;

import android.widget.TextView;

public class LaunchActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

Button button = new Button(this);
button.setText("Start TestLeakActivity");
button.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
Intent intent = new Intent(LaunchActivity.this, TestLeakActivity.class);
startActivity(intent);
}
});

ViewGroup container = ((ViewGroup) findViewById(android.R.id.content));
container.addView(button);
}

}


TestLeakActivity.java



package com.example.testleakproject;

import android.app.Activity;
import android.os.Bundle;

import android.view.ViewGroup;
import android.widget.EditText;

public class TestLeakActivity extends Activity {
private byte[] mSomeBytes = new byte[1048576];

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


EditText editText = new EditText(this);
editText.setHint("TestLeakActivity");

ViewGroup container = ((ViewGroup) findViewById(android.R.id.content));
container.addView(editText);
}
}

Answer



This is a known bug, that will be fixed in ICS MR1.



No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...