首页 > 解决方案 > 如何使用 ViewModel 正确保存位图?

问题描述

官方的android文档中,关于如何实现a ViewModel有这个方法:

private void loadUsers() {
        // Do an asynchronous operation to fetch users.
    }

就我而言,我不需要获取任何数据,我只想将bitmapwhich 保存在另一个类中,而不是ActivityClass.

我尝试制作一个 setter 方法,但我无法制作ViewModel该类的对象! <(看看我的编辑)>

那么,如何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 构造?

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不按代码顺序运行,但是,它在onCreate(). 这就是为什么你不能像我一样依赖它来将值保存到全局变量中。
  2. 如果ViewModel它没有存储任何值,它根本不起作用!因此,无需检查其中是否存在值。
  3. 它每次都被调用onResume()或被onStart()调用 - 我不确定是哪个 - 不管是否onCreate()被调用..

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

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

PreviewActivity(我使用的地方ViewModel

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

MainActivity(启动 PreviewActivity)

LogCat 错误

标签: androidbitmapandroid-architecture-componentsandroid-viewmodelandroid-savedstate

解决方案


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

虽然不是直接从您的简单 java 类存储位图,我建议您在viewModel初始化您的活动类中获取您的简单 java 类的实例,从那里您可以将您的位图存储在viewModel.


推荐阅读