android - 如何使用 ViewModel 正确保存位图?
问题描述
在官方的android文档中,关于如何实现a ViewModel
,有这个方法:
private void loadUsers() {
// Do an asynchronous operation to fetch users.
}
就我而言,我不需要获取任何数据,我只想将bitmap
which 保存在另一个类中,而不是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)); } }
那么,如何bitmap
使用 a 以正确的方式保存 a ViewModel
?谢谢!
编辑:
我在包外创建类时犯了错误ViewModel
,但我修复了这个问题,并像loadScaledImage()
之前提到的方法那样调用了 setter 方法。
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 构造?
- 所以,现在,这就是我设置和获取位图的方式:
将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)
解决方案
您根本无法ViewModel
在任何其他简单的 java 类而不是 Activity 类中创建对象,因为它的唯一目的是了解 Activity 生命周期。
虽然不是直接从您的简单 java 类存储位图,我建议您在viewModel
初始化您的活动类中获取您的简单 java 类的实例,从那里您可以将您的位图存储在viewModel
.