, у меня есть простое действие, которое загружает растровое изображение в onCreate
. Я обнаружил, что если повернуть устройство, я могу увидеть из журналов, которые onCreate
вызвал снова.Фактически, поскольку все переменные экземпляра снова установлены на значения по умолчанию, я знаю, что все Activity было повторно создано.
После двухкратного поворота я получаю FC, потому что для растрового изображения не может быть выделено достаточно памяти. (Все ли экземпляры активности где-то еще живы? Или сборщик мусора не очищается достаточно быстро?)
@Override
public void onCreate(Bundle savedInstanceState) {
File externalStorageDir = Environment.getExternalStorageDirectory();
File picturesDir = new File(externalStorageDir, "DCIM/Camera");
File[] files = picturesDir.listFiles(new FilenameFilter(){
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".jpg");
}});
if (files.length > 0) {
Bitmap bm = BitmapFactory.decodeStream(new FileInputStream(files[0]));
ImageView view = (ImageView) findViewById(R.id.photo);
view.setImageBitmap(bm);
}
}
Из всего, что я прочитал, onCreate следует вызывать один раз за время существования приложения. Я ошибаюсь в этом? Как изменение ориентации устройства может привести к воссозданию действия?
В то время как Явный путь может работать, существует лучшее и надлежащее решение для этих типов проблем. Класс ViewModel. Необходимо взглянуть здесь: https://developer.android.com/topic/libraries/architecture/viewmodel
В основном, Вы расширяете класс ViewModel и определяете все элементы данных в нем, которые мы хотим быть неизменными по созданию ре действия (в этом изменении ориентации случая). И предоставьте соответствующие методы для доступа к методам от класса Действия. Таким образом, когда Действие является созданным ре, объект ViewModel все еще там и так является нашими данными!