【问题标题】:Calling abstract method in livedata callback在 livedata 回调中调用抽象方法
【发布时间】:2020-01-17 03:06:15
【问题描述】:

我有一个抽象父类,带有一些抽象方法。现在我有这个超级班的4个孩子。我正在观察超类中的实时数据,如下所示:

 viewModel.getSignedS3LiveData().observe(this, commonResponse -> {
        if(commonResponse != null)
        {
            handleSignedS3Response(commonResponse);     //abstract method
        }
    });

其中 handleSignedS3Response 是一个抽象方法。

场景是我有 4 个片段扩展了这个超类,并一个接一个地添加到 backstack(所以 4 个步骤)。

当添加第 1 步时,将调用 handleSignedS3Response 的正确实现方法,该方法位于片段 1 中。

当我从片段 1 移动到片段 2 时,handleSignedS3Response 在片段 1 中被调用,而不是在片段 2 中。

这仅发生在我在 livedata 回调中调用的方法上。即使对于不在 livedata 回调中的 fragment2,还有其他抽象被正确调用。

请帮我解决这个问题。如果有什么我无法解释清楚的,请询问。

【问题讨论】:

  • 所有 registered observers of the livedata will be called ,在您的情况下,该方法将从片段 1 和片段 2 中调用 两次。您应该杀死片段 1 或从片段 1 中删除观察者,而片段事务以避免方法被调用两次!
  • 如果是这种情况,我会在两种实现方法中都收到调用。即使发生这种情况,我也会处理的。
  • 不能调用abstract 方法,只能调用它们的实现。

标签: java android


【解决方案1】:

你可以这样试试吗:

abstract class SuperClass(private val factory: ViewModelProvider.Factory) : Fragment() {
    abstract fun imaginaryMethod()

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        activity?.let {
            val vm = ViewModelProvider(it::getViewModelStore, factory).get(TheViewModel::class.java)
            vm.aliveData.observe(it, Observer {
                imaginaryMethod()
            })
        }
    }
}
class Fragment1(private val factory: ViewModelProvider.Factory) : SuperClass() {
    override fun imaginaryMethod() {
        println("FRAGMENT1 IMAGINED")
    }
}
class Fragment2(private val factory: ViewModelProvider.Factory) : SuperClass() {
    override fun imaginaryMethod() {
        println("FRAGMENT2 IMAGINED")
    }
}

这是我通常的做法,它对我有用。我也通常使用匕首来提供工厂。但这也有效。

来自 Activity 的工厂:

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val factory = ViewModelProvider.NewInstanceFactory()

        supportFragmentManager.beginTransaction().add(Fragment1(factory), null).addToBackStack("hello").commit()
        supportFragmentManager.beginTransaction().add(Fragment2(factory), null).addToBackStack("hello").commit()
    }

来自控制台的结果:

I/System.out: FRAGMENT1 IMAGINED
    FRAGMENT2 IMAGINED

【讨论】:

    猜你喜欢
    • 2017-05-02
    • 2012-09-21
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 2016-06-20
    相关资源
    最近更新 更多