在android官方文档中,关于如何实现ViewModel
,有这样的方法:
private void loadUsers() {
// Do an asynchronous operation to fetch users.
}
在我的情况下,我不需要获取任何数据,我只想将bitmap
保存在ActivityClass
之外的另一个类中。
我试着制作一个setter方法,但我不能制作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)); } }
那么,如何使用ViewModel
以正确的方式保存bitmap
?谢谢
编辑:
我犯了一个错误,在包外创建了ViewModel
类,但我解决了这个问题,并像那样调用了setter方法。。在我前面提到的CCD_ 8方法中。
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
中有两个参数,但现在文档中就是这样,第二个很奇怪,我有java8,或者不是这样吗?
更新:
使用我找到的这两个答案,我能够解决我的最后一个问题:
无法解析片段中的ViewModelProvider构造?
Java";lambda表达式在此语言级别上不受支持";
- 所以,现在,这就是我设置和获取位图的方式:
将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
不是按照代码的顺序运行的,但是在CCD_ 18中的所有内容之后运行。这就是为什么你不能依赖在它上保存一个值到一个全局变量,就像我做的那样- 如果
ViewModel
上没有存储任何值,则它在全部的因此,无需检查其中是否有值 - 每次调用
onResume()
或onStart()
时都会调用它-我不确定是哪一个-不管onCreate()
是是否被呼叫
所以,我重构了代码,但仍然缺少一些东西即使是ViewModel
,所有代码都能正常工作,但当我更改设备语言以检查它是否能成功使用保存的图像时。。出现错误!!
我正在与您共享我的代码:
预览活动(我使用ViewModel
(
助手类(准备图像并将其设置到屏幕上(
主活动(浏览预览活动(
LogCat错误
您不能在任何其他简单的java类而不是Activity类中创建ViewModel
对象,因为它的唯一目的是了解活动生命周期。
尽管我建议在初始化viewModel
的活动类中获取简单java类的实例,而不是直接存储来自简单java类中的位图,但从那里可以将位图存储在viewModel
中。