Подтвердить что ты не робот

Почему EditText сохраняет свой контекст активности в сэндвиче с мороженым

В Ice Cream Sandwich, когда есть Activity, содержащий EditText, EditText сохранит контекст активности даже после того, как пользователь покинет Activity. Чтобы продемонстрировать это, я создал TestLeakActivity, который выделяет большой массив байтов. Поскольку контекст активности никогда не собирает мусор, массивы байтов накапливаются в куче, в результате вызывая OutOfMemoryError. Вы можете наблюдать рост кучи, используя инструмент кучи DDMS, и вы можете отслеживать выдающиеся ссылки на класс EditText, просматривая файл HPROF в Eclipse MAT. Чтобы создать утечку памяти, перейдите в LaunchActivity и просто продолжайте запуск и поддержку 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);
    }
}
4b9b3361

Ответ 1

Это известная ошибка, которая будет исправлена ​​в ICS MR1.

Ответ 2

Это не исправлено до сих пор. (Android 4.2.1)

Ответ 3

Я просто потратил несколько часов, чтобы понять, что я затронута этой проблемой.

Проблема, похоже, вызвана проверкой орфографии. Когда я отключу предложения для просмотра EditText, все правильно собрано мусором.

mInputType = mText.getInputType();
mText.setInputType(mInputType | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);

Я действительно не хочу отключать это, так как многие пользователи хотят проверить орфографию. Таким образом, возможно, есть способ временно включить его, когда поле ввода получает фокус.

Если вам не нужна проверка орфографии, просто добавьте это в элемент EditText в свой макет xml:

android:inputType="textNoSuggestions"

Это тоже исправляет.

Edit:

Только что нашел этот поток, который, как представляется, связан: Работайте с утечкой SpellCheckerSession?

Ответ 4

Я испытываю то же самое. Мои устройства Gingerbread все работают нормально, но тестирование на моем Galaxy Nexus создает такую ​​ситуацию. Скорее всего, ваши опыты, почему обновления MR1 и 4.0.3 выкатились так быстро.

Ответ 6

У меня такая же проблема, Я решил это, спрятав EditText ondismiss моего диалога.

  mEditText.setVisibility(View.GONE);