【问题标题】:Pass parameter WeakReference<View> to method of ViewModel?将参数 WeakReference<View> 传递给 ViewModel 的方法?
【发布时间】:2019-05-31 02:32:01
【问题描述】:

我们的团队正在讨论是否应该将参数WeakReference&lt;View&gt; 传递给ViewModel 的方法。我在google的文档中看到说

注意:由于 ViewModel 比特定 Activity 和 Fragment 实例的寿命更长,因此它不应该引用 View 或任何可能持有对 Activity 上下文的引用的类。如果 ViewModel 需要 Application 上下文(例如,寻找系统服务),它可以扩展 AndroidViewModel 类,并在构造函数中有一个接收 Application 的构造函数(因为 Application 类扩展了 Context)。

如果我们使用 WeakReference&lt;View&gt; 将视图传递给 viewmodel 怎么样? WeakRef 可以防止内存泄漏的发生,但是一些成员表示它会使阅读/维护代码变得困难。有些人建议使用接口 ViewInf 和 View 将实现到 ViewInf 和 viewmodel 中的方法使用将是这样的。

    fun methodA(viewInf: WeakReference<ViewInf>)() {
        doSomeBackgroundThread(viewInf)
    }

我们想用这个视图在位图上绘制,并用位图保存到内存缓存中。

【问题讨论】:

  • 不要那样做。它将打破依赖和责任规则。 View 自己负责绘制位图。

标签: android architecture android-viewmodel


【解决方案1】:

Google 的警告是有道理的,因为 ViewModel 除了传输数据之外不应该做任何事情。

有时我们会陷入设计的“面向对象”部分,以至于忘记了域对象和应用程序基础设施对象应该只进行交互以从应用程序中提取数据或将数据注入到应用程序中进行处理。

【讨论】:

    猜你喜欢
    • 2012-05-13
    • 1970-01-01
    • 2021-06-08
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 2014-09-15
    相关资源
    最近更新 更多