如何使用ViewModel正确保存位图



在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的生命周期及其条款(因为我对此一无所知(,但我注意到(如果我说了什么错误,请纠正我(:

  1. ViewModel不是按照代码的顺序运行的,但是在CCD_ 18中的所有内容之后运行。这就是为什么你不能依赖在它上保存一个值到一个全局变量,就像我做的那样
  2. 如果ViewModel上没有存储任何值,则它在全部的因此,无需检查其中是否有值
  3. 每次调用onResume()onStart()时都会调用它-我不确定是哪一个-不管onCreate()是是否被呼叫

所以,我重构了代码,但仍然缺少一些东西即使是ViewModel,所有代码都能正常工作,但当我更改设备语言以检查它是否能成功使用保存的图像时。。出现错误!!

我正在与您共享我的代码:

预览活动(我使用ViewModel(

助手类(准备图像并将其设置到屏幕上(

主活动(浏览预览活动(

LogCat错误

您不能在任何其他简单的java类而不是Activity类中创建ViewModel对象,因为它的唯一目的是了解活动生命周期。

尽管我建议在初始化viewModel的活动类中获取简单java类的实例,而不是直接存储来自简单java类中的位图,但从那里可以将位图存储在viewModel中。

最新更新