如何使用 Android 的架构组件完成 ViewModel 的活动?

2024-02-28

我尝试找出如何以最佳方式从 ViewModel 完成 Activity。我找到了使用 LiveData 对象并发出“信号”来执行此操作的一种方法。

我怀疑这个解决方案是否有开销。那么这是正确的解决方案还是我应该使用更准确的解决方案?

来看示例:假设应用程序中有一个活动 MainActivity 和视图模型,如下所示:

 class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val model = ViewModelProviders.of(this).get(MainViewModel::class.java)

        model.shouldCloseLiveData.observe(this, Observer { finish() })

    }
 }

作为 MainActivity 的伴侣,MainViewModel 如下所示:

class MainViewModel(app: Application) : AndroidViewModel(app) {

  val shouldCloseLiveData = MutableLiveData<Void>()

  fun someAction(){
    shouldCloseLiveData.postValue(null)
  }

}

我同意您的感受,即该解决方案看起来不整洁有两个原因。First用一个MutableLiveData对象发出事件信号是一种解决方法。没有数据被改变。Second将 LiveData 暴露给视图模型的外部违反了以下原则封装一般来说。

我仍然对 Android 这个丑陋的概念感到惊讶。他们应该提供一个选项来观察视图模型而不是它的内部LiveData对象。

我尝试过WeakReferences 来实现观察者模式。这是不稳定的。以不可预测的方式,WeakReference丢失了 (null),在这种情况下无法调用finish()。这很令人惊讶,因为我认为该活动在运行时不会被垃圾收集。

所以这是排除法的部分答案。观察者模式实现为WeakReference似乎无法替代你的建议。

不知道如果我在期间删除引用,通过硬引用实现观察者模式是否合法onStop(), or onDestroy()。我问了这个问题here https://stackoverflow.com/questions/50000975/am-i-allowed-to-observe-a-viewmodel-if-i-clean-up-the-back-references.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Android 的架构组件完成 ViewModel 的活动? 的相关文章

  • Nexus One / Android“CPU 可能被固定”错误

    我正在使用 NDK 修订版 4 和 OpenGL ES 2 0 为 Nexus One 编写一款图形密集型游戏 我们真的在这里推动硬件 并且在大多数情况下它运行良好 除了偶尔我会因以下日志消息而严重崩溃 W SharedBufferStac
  • 带图标的 Android 选项菜单

    如何使用选项菜单显示图标 我尝试了以下代码 但我的选项菜单没有图像图标 我正在使用 android 版本 4 0 来开发应用程序 Java代码 public boolean onCreateOptionsMenu Menu menu sup
  • 序列化 ArrayList

    我正在尝试编写一个 Android 游戏 即使用户想要返回主菜单或者活动被系统终止 我也希望能够暂停游戏 onSaveInstanceState 似乎并没有给我很大的控制权来决定何时可以读回捆绑包 而且据我所知 捆绑包仅在短时间内有效 所以
  • 如何在导航抽屉上显示谷歌加个人资料图片?

    下面的代码来自github 用于在android应用程序中通过gmail登录 我做了一些修改以使用volley显示个人资料图片 它工作正常 我只想在导航抽屉中显示这些内容 个人资料图片 姓名和电子邮件 ID 我使用了 android stu
  • 更改 Android 应用程序的所有字体[重复]

    这个问题在这里已经有答案了 如何更改 Android 应用程序的整个字体 以前我看到这个帖子 https gist github com artem zinnatullin 7749076在 github 上 该解决方案仅适用于低于 api
  • 如何在无头Linux中更新Android平台工具?

    我们有一些没有安装 X Window 的 CI 主机 我知道如何使用 android 更新命令更新 SDK 但如何使用此命令更新平台工具 您可以使用以下命令 android list sdk android update sdk no ui
  • 需要在状态改变时关闭MediaRecorder播放的声音

    我已尝试在下面的链接中找到的更改 但没有效果 如何在状态改变时关闭 MediaRecorder 播放的声音 https stackoverflow com questions 6804205 how to shut off the soun
  • 如何让TalkBack自动读取TextView错误信息?

    我目前正在使我的应用程序可访问 但我的 EditTexts 遇到问题 在每个 EditText 中 用户的输入都会在某个时刻 例如按下按钮后 进行验证 如果输入无效 我会使用以下命令显示错误editText setError message
  • 如何在Android中创建类似架子的视图?

    如何在android中创建一个类似书架的视图 在任意行中显示多本书 此外 它应该具有像 Moon reader 应用程序那样的水平和垂直功能 我可以编写一个水平移动的架子视图 但它不能完全工作 我使用 xml 文件来查看包含图像 文本和按钮
  • NanoHTTPD 如何将上传的文件保存到SD卡文件夹

    如何将上传的文件保存到SD卡文件夹 目前它存储到 data data cache文件夹 文件名如 NanoHTTPD 一些随机数 我无法将其复制到 SD 卡中的任何文件夹位置 我想将文件保存到 SD 卡中前面提到的文件夹位置 其名称与从我的
  • 使用 OpenWeatherMap API 密钥

    我得到异常 http api openweathermap org data 2 5 weather q 悉尼 http api openweathermap org data 2 5 weather q Sydney 有人可以帮助如何使用
  • 最好使用的游戏/物理引擎?

    寻找用于移动游戏开发的游戏 物理引擎 iPhone 有Cocos2D http www cocos2d iphone org 我找到的安卓系统RokonAndroid http rokonandroid com 只是想知道是否还有其他人知道
  • 如何使用Gson将JSONArray转换为List?

    在我的 Android 项目中 我试图将收到的 JSONArray 转换为列表 在 的帮助下这个答案 https stackoverflow com questions 8371274 how to parse json array in
  • 从 java 活动 *.java 启动 kotlin 活动 *.kt?

    使缓存无效 重新启动 帮助我 我在java类中的代码是 Intent intent new Intent view getActivity AddPaymentActivity class view getActivity startAct
  • Keytool 不要求别名密码

    我正在尝试生成一个密钥库文件来签署我的 React Native Android 应用程序并将其发布到 Play 商店 我正在尝试按照本文档中的描述进行操作 https facebook github io react native doc
  • 如何更改Android软键盘中任意键的按键背景

    我想让键盘上的一些键与其他键不同 例如下图中的shift 删除 空格键 根据google的参考文档 我们可以通过使用 来改变按键的背景android keybackground drawable xxx in input xml 但它改变了
  • 从另一个活动返回时 Android ListView 项目没有响应?

    我从 ArrayAdapter 创建一个 ListView ListView的每一行都有一个ImageView和一个TextView 现在我使用 setOnItemClickListener 处理单击事件 lv getListView lv
  • getApplicationDocumentsDirectory 在 flutter 桌面(Windows)上不起作用

    如何在 Windows 上的 flutter 桌面上保存和打开文件 getApplicationDocumentsDirectory 不适用于 Windows 应用程序的 flutter 桌面 Future
  • 如何从 Android 应用程序调用 REST API? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是 android 新手 也是编程新手 如何从 Android 应用程序调用 REST api GET POST 请求 请给我推荐一
  • 更改 ActionMode 溢出图标

    有没有办法更改 ActionMode Overflow 图标而不更改 正常 ActionBar 的图标 我仍然需要弄清楚如何仅更改 ActionMode Actionbar 内部的溢出图标 因为我更改了默认操作栏中的溢出图标 该图标在 Ac

随机推荐