Понимание документации Android: обработка фрагментов среды выполнения "никогда не должна передавать объект, связанный с действием"

Я относительно новичок в программировании и у меня проблемы с изменением ориентации. Буду благодарен за любые мысли.
Это конкретный вопрос об официальной документации Android, пожалуйста, не сообщайте об этом вопросе как о дубликате и покажите мне общую ветку времени выполнения обработки.

После прочтения документации я не уверен насчет части, указанной ниже.

Мой вопрос: если у меня есть таймер, который показывает текущее значение в TextView, означает ли это, что мне вообще не следует использовать фрагмент для сохранения объекта?
Или это просто означает, что я должен полностью отделить парфюмера от действия?

Документация по Android:

Предостережение. Несмотря на то, что вы можете хранить любой объект, вы никогда не должны передавать объект, привязанный к Activity, например Drawable, Adapter, View или любой другой объект, связанный с Context. Если вы это сделаете, это приведет к утечке всех представлений и ресурсов исходного экземпляра действия. (Утечка ресурсов означает, что ваше приложение удерживает их, и они не могут быть собраны мусором, поэтому много памяти может быть потеряно.)

https://developer.android.com/guide/topics/resources/runtime-changes.html

Исходная информация:

Мое приложение: (несколько) интервальные таймеры.
Я хотел бы сохранить отображение таймера, если изменение ориентации происходит во время выполнения.

Сначала я использовал хакерское решение в манифестации, но оно привело к проблемам, поэтому подумал, почему бы не попытаться решить проблему чисто.
Если я не могу сделать это, то, скорее всего, я позволю пользователю решить, какую ориентацию он или она предпочитает, а затем исправлю это во время работы таймера.

1 ответ

Решение

Проще говоря, вы не должны иметь ссылку на TextView в Timer, Вы можете прочитать об утечках памяти, если хотите, но эта цитата дает веские основания... "Ваше приложение удерживает их, и они не могут быть собраны мусором, поэтому может быть потеряно много памяти"

Вы можете использовать интерфейс от таймера, хотя.

public class MyTimer extends Timer {

    public interface TextChangeListener {
        public void onTextChange(String text);
    }

    private MyTimer.TextChangeListener listener;

    public MyTimer(TextChangeListener listener) {
        this.listener = listener;
    }

    @Override
    public void schedule(...) { // TODO: Pick which one to override
        super.schedule(...); // TODO: Use the same params
        if (listener != null) {
            listener.onTextChange("Some text");
        }
    }
}

Затем просто внедрите этот интерфейс и запустите таймер

public class MainActivity extends AppCompatActivity
      implements MyTimer.TextChangeListener  {

    private TextView textView;

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.activity_main);
        // TODO: textView = findViewById(R.id.textView);
        Timer t = new MyTimer(this); // 'this' refers to the interface
        // TODO: Start timer
    }

    public void onTextChange(String text) {
        textView.setText(text);
    }

}

Если вам нужно справиться с изменениями ориентации, то я считаю, что ссылка обсуждает использование onSaveInstanceState а также onRestoreInstanceState методы

Другие вопросы по тегам