【问题标题】:Using LiveData with Content Provider将 LiveData 与内容提供程序一起使用
【发布时间】:2018-10-01 15:49:55
【问题描述】:

我正在尝试将 LiveData 与 Android 上的 Content Provider 一起使用,但是我无法管理它,因为 Provider 查询方法如下:

public Cursor query

所以它返回一个光标,而我需要一个 LiveData。 如果我尝试将查询方法的返回类型更改为

public LiveData<Cursor> query

我得到错误:

 "error: query(Uri,String[],String,String[],String) in FaProvider cannot override query(Uri,String[],String,String[],String) in ContentProvider
return type LiveData<Cursor> is not compatible with Cursor"

是否有任何解决方案可以将 LiveData 与 Content Provider 一起使用?

【问题讨论】:

  • 创建您自己的 MutableLiveData 类的实现,接收 Content 的 Provider URI 作为参数。在 onActive() 方法中,注册内容提供者观察者,每当调用 onChange() 方法时,将值发布到您的 LiveData:

标签: android android-contentprovider android-livedata


【解决方案1】:

应该能够用像@mohd-faizan 提到的可变实时数据对象来包装光标

abstract class ContentProviderLiveData<T>(
private val context: Context,
private val uri: Uri ) : MutableLiveData<T>() {
private lateinit var observer: ContentObserver

override fun onActive() {
    observer = object : ContentObserver(null) {
        override fun onChange(self: Boolean) {
            // Notify LiveData listeners an event has happened
            postValue(getContentProviderValue())
        }
    }

    context.contentResolver.registerContentObserver(uri, true, observer)    }

override fun onInactive() {
    context.contentResolver.unregisterContentObserver(observer)
}

/**
 * Implement if you need to provide [T] value to be posted
 * when observed content is changed.
 */
abstract fun getContentProviderValue(): T

}

更多: https://medium.com/@jmcassis/android-livedata-and-content-provider-updates-5f8fd3b2b3a4

【讨论】:

  • 这是完全错误的解决方案...... getContentProviderValue() 将在主线程上调用......如果我正确理解 getContentProviderValue() 将执行 ContentProvider.query 显然不应该在主线程上调用线程...我没有看到任何正确的解决方案,我知道的唯一一个是androidx.loader.app.LoaderManager 实现...但很难在ViewModel 中重用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
相关资源
最近更新 更多