gpt4 book ai didi

java - 在livedata回调中调用抽象方法

转载 作者:行者123 更新时间:2023-12-01 18:48:31 24 4
gpt4 key购买 nike

我有一个抽象父类,带有一些抽象方法。现在我有4个这个超类的 child 。我正在观察父类(super class)中的实时数据,如下所示:

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

其中handleSignedS3Response是一个抽象方法。

场景是我有 4 个 fragment 扩展这个父类(super class),并被一个接一个地添加到后台堆栈(所以需要 4 个步骤)。

添加步骤 1 后,将调用 handleSignedS3Response 的正确实现方法,该方法位于 fragment 1 中。

当我从fragment1移动到fragment2时,在fragment 1中调用handleSignedS3Response,而不是在fragment2中调用。

此外,这种情况仅发生在我在 livedata 回调中调用的方法中。即使对于不在 livedata 回调中的fragment2,也可以正确调用其他抽象。

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

最佳答案

你可以这样尝试吗:

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")
}
}

这就是我通常的做法,它对我很有效。我也通常使用工厂提供的 Dagger 。但这也有效。

来自 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

关于java - 在livedata回调中调用抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59773461/

24 4 0