- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
目前需要 LifecycleOwner 才能创建观察者。
我有在 ViewModel 中创建观察者的代码,因此在我的 Fragment 中检索 ViewModel 时我附加了 LifecycleOwner。
根据 Google 的文档。
警告:ViewModel 绝不能引用 View 、生命周期或任何可能包含对 Activity 上下文的引用的类。
我是否违反了该警告?如果违反了,您建议我以何种方式移动我创建的数据返回观察者?
我只做了一个观察者,所以我想知道它是否仍然有效。因为在谷歌的文档中它也说了。
ViewModel 对象可以包含 LifecycleObservers,例如 LiveData 对象。
主 fragment
private lateinit var model: MainViewModel
/**
* Observer for our ViewModel IpAddress LiveData value.
* @see Observer.onChanged
* */
private val ipObserver = Observer<String> {
textIp.text = it
hideProgressBar()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
model = ViewModelProviders.of(this).get(MainViewModel::class.java)
model.attach(this)
}
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? =
inflater?.inflate(R.layout.fragment_main, container, false)
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
buttonRetrieveIp.setOnClickListener {
showProgressBar()
model.fetchMyIp().observe(this, ipObserver) //Here we attach our ipObserver
}
}
override fun showProgressBar() {
textIp.visibility = View.GONE
progressBar.visibility = View.VISIBLE
}
override fun hideProgressBar() {
progressBar.visibility = View.GONE
textIp.visibility = View.VISIBLE
}
主视图模型
private var ipAddress = MutableLiveData<String>()
private lateinit var owner: LifecycleOwner
fun attach(fragment: MainFragment) {
owner = fragment
}
/**
* For more information regarding Fuel Request using Fuel Routing and Live Data Response.
* @see <a href="https://github.com/kittinunf/Fuel#routing-support">Fuel Routing Support</a>
* @see <a href="https://github.com/kittinunf/Fuel#livedata-support">Fuel LiveData Support</a>
* */
fun fetchMyIp(): LiveData<String> {
Fuel.request(IpAddressApi.MyIp())
.liveDataResponse()
.observe(owner, Observer {
if (it?.first?.statusCode == 200) {//If you want you can add a status code checker here.
it.second.success {
ipAddress.value = Ip.toIp(String(it))?.ip
}
}
})
return ipAddress
}
更新 1:根据@pskink 关于使用转换的建议改进了 ViewModel。
private lateinit var ipAddress:LiveData<String>
/**
* Improved ViewModel since January 23, 2018 credits to <a href="https://stackoverflow.com/users/2252830/pskink">pskink</a> <a href="
*
* For more information regarding Fuel Request using Fuel Routing and Live Data Response.
* @see <a href="https://github.com/kittinunf/Fuel#routing-support">Fuel Routing Support</a>
* @see <a href="https://github.com/kittinunf/Fuel#livedata-support">Fuel LiveData Support</a>
* */
fun fetchMyIp(): LiveData<String> {
ipAddress = Transformations.map(Fuel.request(IpAddressApi.MyIp()).liveDataResponse(), {
var ip:String? = ""
it.second.success {
ip = Ip.toIp(String(it))?.ip
}
ip
})
return ipAddress
}
最佳答案
没有。如果您希望观察 ViewModel
中某些 LiveData
的变化,您可以使用 observeForever()
,它不需要 LifecycleOwner
.
记得在 ViewModel
的 onCleared()
事件中移除这个观察者:
val observer = new Observer() {
override public void onChanged(Integer integer) {
//Do something with "integer"
}
}
...
liveData.observeForever(observer);
...
override fun onCleared() {
liveData.removeObserver(observer)
super.onCleared()
}
很好的引用 observe LiveData 的例子.
关于android - 我应该在 ViewModel 中包含 LifecycleOwner 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48396092/
每当在我的回收器 View fragment 中创建新条目时,我都会尝试将记录插入到我的房间数据库中。为了添加新条目,我观察存储库类中的 GetTasks 方法返回的实时数据,并将添加到我的shows
我的应用程序中有一个组件可以在数据库更新时执行特定的工作。为了观察 Room 表,我需要使用 LiveData,这需要我传递 LifecycleOwner。我的组件与任何 View 都无关,因此我没有
我想将 Room 与 LiveData 一起使用,在其他项目中我已经使用过它,但在这个项目中,我无法让它工作。当我尝试观察实时数据时,它无法将我的 Activity 转换为生命周期 Activity
我的 MainActivity 扩展了 AppCompatActivity public class MainActivity extends AppCompatActivity { private
我正在使用 Android 支持库 26.1.0。这些是应用程序模块中的依赖项 - implementation "android.arch.lifecycle:runtime:1.0.0" impl
我想使用来自服务类的实时数据选择房间数据库中的数据。如何在观察时转换 LifecycleOwner? repositoryDatabase.getTimeline().observe(this, ti
在哪种情况下 android-build/android-studio 会显示这些错误? Cannot access androidx.lifecycle.LifecycleOwner and Can
假设 CoroutineScope 是由一些生命周期感知组件实现的,比如 Presenter。什么时候使用 GlobalScope.produce 与 CoroutineScope.produce 比
我有以下场景。我有一个包含 fragment 的 Activity 。在这个 fragment 中,我显示了一些来自后端数据库的记录。我也在使用一个看起来像这样的适配器: public class M
我需要让 LifecycleOwner 在我的 FirestoreRecyclerViewOption 中传递它,但 Fragment 没有实现生命周期。 那么,如何获得呢? 我的 Fragment
我有一个 fragment : class MyFragment : BaseFragment() { // my StudentsViewModel instance lateinit
我已经开始学习架构组件,但找不到任何东西。 LifecycleFragment只是创建一个新的 LifecycleRegistry对象,它不会开始观察 fragment 的生命周期。 我猜 Lifec
MainActivity cannot be converted to LifecycleOwner我用它作为 LiveCycle 所有者,但它被拒绝了,我得到了一个错误,如图所示。我在 Api 25
不幸的是,我不能将 getApplication() 用作 LifecycleOwner,因为 android.app.Application 似乎没有实现它。 为什么 android.app.App
我在我的项目中使用MVVM。但是当我创建App Widget时,他不支持updateAppWidget()中的LifecycleOwner var model: CurrencyViewModel m
我正在使用AbstractSavedStateViewModelFactory使用SavedStateHandle在具有非空构造函数的 View 模型中。但我收到一个非法状态异常,说它已经附加到生命周
我正在尝试使用 android ViewModel 和 LiveData,但是当我想要创建观察时出现错误。第一个参数给我一个错误:错误的第一个参数类型,它是 expect Lifecycleowner
目前需要 LifecycleOwner 才能创建观察者。 我有在 ViewModel 中创建观察者的代码,因此在我的 Fragment 中检索 ViewModel 时我附加了 LifecycleOwn
我知道看起来像是一些愚蠢的错误,但我找不到它。在我的项目中,我可以从我的 fragment 访问 LifecycleOwner,但不能从 Activity 访问。 这是我的build.gradle i
在我看来,我应该添加 binding.lifecycleOwner=this当我使用 viewModel . 我发现很多项目,例如 Code A 没有添加 binding.lifecycleOwner
我是一名优秀的程序员,十分优秀!