В официальной документации Android о том, как реализовать ViewModel
, < strong> есть такой способ:
private void loadUsers() {
// Do an asynchronous operation to fetch users.
}
В моем случае мне не нужно получать какие-либо данные, я просто хочу сохранить bitmap
, который находится в другом классе, чем ActivityClass
.
Я пробовал создать метод установки, но не могу создать объект класса ViewModel
! ‹(Посмотрите мою правку)>
Это мой класс ViewModel:
public class MyViewModel extends ViewModel { private MutableLiveData<Bitmap> bitmapMutableLiveData; public LiveData<Bitmap> getBitmapMutableLiveData() { if (bitmapMutableLiveData == null) { bitmapMutableLiveData = new MutableLiveData<Bitmap>(); } return bitmapMutableLiveData; } public void setBitmap(Bitmap bitmapImage) { bitmapMutableLiveData.postValue(bitmapImage); } }
Вот где я беру и устанавливаю растровое изображение:
void loadScaledImage(Uri photoUri){ mUpdateGraphicViews.onClear(); if(photoUri != null){ bitmapImage = decodeSampledBitmapFromUri(photoUri); mImageView.setImageBitmap(bitmapImage); mFTR.recognizeTextFromImage(getScaledBitmap(bitmapImage)); } }
Итак, как правильно сохранить bitmap
, используя ViewModel
? Спасибо!
ИЗМЕНИТЬ:
Я сделал ошибку, создав класс ViewModel
вне пакета, но я исправил это и вызвал метод установки, подобный этому ... в методе loadScaledImage()
, о котором я упоминал ранее.
myViewModel.setBitmap(bitmapImage);
Но теперь я столкнулся с новой проблемой в onCreate()
методе !!!!
MyViewModel model = new ViewModelProvider(this).get(MyViewModel.class); //Cannot resolve constructor ViewModelProvider(com.ziad.sayit.PreviewActivity)
model.getBitmapMutableLiveData().observe(this, bitmapMutableLiveData -> { //Lambda expressions are not supported at language level 7
// update UI
});
Я заметил, что конструктор ViewModelProvider()
принимает два параметра в super-class
, но теперь это так в документации, а второй странный, у меня java 8 или это не так?
Обновление:
Используя эти два ответа, которые я нашел, я смог исправить свою последнюю проблему:
Не удается разрешить конструкцию ViewModelProvider во фрагменте?
лямбда-выражения Java не поддерживаются на этом уровне языка
- Итак, вот как я устанавливаю и получаю растровое изображение:
Сделал объект ViewModel
как глобальную переменную:
Bitmap savedImage;
MyViewModel model;
А это в onCreate():
model = new ViewModelProvider(this).get(MyViewModel.class);
model.getBitmapMutableLiveData().observe(this, bitmapMutableLiveData -> {
savedImage = bitmapMutableLiveData;
});
И вот как я установил bitmap
if(savedImage != null) {
helper.loadSavedBitmap(savedImage); //load the saved image
}else{
helper.loadScaledImage(imageUri); //there is a bunch of code before this but I delete it for the simplicity
model.setBitmap(helper.bitmapImage); //set that new Image
}
Но потом я протестировал приложение, и ничего не изменилось!
Обновление 2:
Итак, я обнаружил, что ViewModel
не работает как обычный код. проблема в приведенном выше коде заключается в том, что я использовал его, игнорируя жизненный цикл ViewModel
и его условия (потому что я не знал ни одного из этого), но я заметил это (и если я сказал что-то не так, пожалуйста, поправьте меня):
ViewModel
не выполняется в порядке кода, однако он выполняется после всего, что указано вonCreate()
. Вот почему вы не можете рассчитывать на то, что он сохранит значение в глобальной переменной, как это сделал я.- Если
ViewModel
не имеет сохраненного значения, он вообще не работает! Так что не нужно проверять, есть в нем значение или нет. - Он вызывается каждый раз, когда вызывается
onResume()
илиonStart()
- я не совсем уверен, какой из них - независимо от того, вызываетсяonCreate()
или нет ..
Итак, я изменил код, но все же кое-что мне не хватает! Весь код работает нормально, даже ViewModel
, но когда я меняю язык устройства на проверьте, удалось ли использовать сохраненное изображение .. возникает ошибка !!
Я делюсь с вами своим кодом:
PreviewActivity (где я использую ViewModel
)
Вспомогательный класс (подготовьте изображение и установите его на экран)
MainActivity (запускает PreviewActivity)