Понимание документации 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
методы