小编Sag*_*gar的帖子

在Android 8上使用android数据绑定时应用程序崩溃

该代码适用于pre-oreo设备,但Crashlytics称它在Android 8设备上崩溃

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getAppComponent().inject(this);
        binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
    }
Run Code Online (Sandbox Code Playgroud)

堆栈跟踪

java.lang.NullPointerException:尝试在空对象引用上调用虚方法'int android.view.ViewGroup.getChildCount()'

Caused by java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.ViewGroup.getChildCount()' on a null object reference
       at android.databinding.DataBindingUtil.bindToAddedViews(DataBindingUtil.java:295)
       at android.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:279)
       at android.databinding.DataBindingUtil.setContentView(DataBindingUtil.java:261)
       at com.myapp.MyActivity.onCreate(MyActivity.java:59)
       at android.app.Activity.performCreate(Activity.java:7174)
       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910)
       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
       at android.app.ActivityThread.-wrap11(Unknown Source)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
       at android.os.Handler.dispatchMessage(Handler.java:105)
       at android.os.Looper.loop(Looper.java:164)
       at android.app.ActivityThread.main(ActivityThread.java:6940)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Run Code Online (Sandbox Code Playgroud)

android android-databinding android-8.0-oreo android-8.1-oreo

9
推荐指数
1
解决办法
2908
查看次数

Viewmodel观察LiveData - 怎么样?

在之前Lifecycle和之前LiveData,Viewmodel可以很容易地观察到它自己的观察者的变化.这只是订阅Observable*变化并对其做出反应的问题.然后可以使用双向绑定立即对用户的输入做出反应.

在Android Studio Canary中,现在允许绑定到LiveData对象,前提是Binding知道其所有者的生命周期(ViewBinding现在有其他setLifecycle方法),Android Studio Canary信息:

您现在可以将LiveData对象用作数据绑定表达式中的可观察字段.ViewDataBinding类现在包含一个新的setLifecycle方法,您需要使用该方法来观察LiveData对象.

但是,Viewmodel文档清楚地说明了:

ViewModel对象可以包含LifecycleObservers,例如LiveData对象.但是,ViewModel对象绝不能观察到生命周期感知的可观察对象(例如LiveData对象)的更改.

(强调我的)

那么,如果ViewModel无法订阅它们,那么如何立即对LiveData更改做出反应呢?

而且,为什么 Viewmodel无法观察到自己的LiveData的变化?

binding android mvvm android-lifecycle android-livedata

8
推荐指数
2
解决办法
3170
查看次数

将LiveData转换为MutableLiveData

显然,Room无法处理MutableLiveData,我们必须坚持使用LiveData,因为它返回以下错误:

error: Not sure how to convert a Cursor to this method's return type
Run Code Online (Sandbox Code Playgroud)

我用这种方式在我的数据库助手中创建了一个"自定义"MutableLiveData:

class ProfileRepository @Inject internal constructor(private val profileDao: ProfileDao): ProfileRepo{

    override fun insertProfile(profile: Profile){
        profileDao.insertProfile(profile)
    }

    val mutableLiveData by lazy { MutableProfileLiveData() }
    override fun loadMutableProfileLiveData(): MutableLiveData<Profile> = mutableLiveData

    inner class MutableProfileLiveData: MutableLiveData<Profile>(){

        override fun postValue(value: Profile?) {
            value?.let { insertProfile(it) }
            super.postValue(value)
        }

        override fun setValue(value: Profile?) {
            value?.let { insertProfile(it) }
            super.setValue(value)
        }

        override fun getValue(): Profile? {
            return profileDao.loadProfileLiveData().getValue()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,我从DB获取更新并可以保存 …

android kotlin android-room android-livedata android-architecture-components

8
推荐指数
3
解决办法
6925
查看次数

从androidx.work.Worker将数据保存到Room失败

我曾尝试将数据从Worker数据库保存到Room数据库.

版本:

  • 工作运行时Ktx - android.arch.work:work-runtime-ktx:1.0.0-alpha02
  • 房间 - android.arch.persistence.room:runtime:1.1.0和android.arch.persistence.room:compiler:1.1.0

MainActivity.kt

private fun runDataDownloadWork() {
        WorkManager.getInstance()
                .beginWith(dwElementTypesWork)
                .then(dwElementsWork)
                .enqueue()
        WorkManager.getInstance().getStatusById(dwElementsWork!!.id)
                .observe(this, Observer { workStatus ->
                    if (workStatus != null && workStatus.state.isFinished) {
                        Log.d("WorkManager", "dwElementsWork finished")
                    }
                })
    }

    private fun createWorkRequests() {
        dwElementsWork = OneTimeWorkRequestBuilder<DWElementsWork>()
                .addTag(DWElementsWork.TAG)
                .setConstraints(wifiConstraints)
                .build()
        dwElementTypesWork = OneTimeWorkRequestBuilder<DWElementTypesWork>()
                .addTag(DWElementTypesWork.TAG)
                .setConstraints(wifiConstraints)
                .build()
    }
Run Code Online (Sandbox Code Playgroud)

DWElementsWork.kt

class DWElementsWork : Worker() {

    companion object {
        const val TAG = "dw_elements_work"
    }

    override fun doWork(): WorkerResult {

        val apiService: APIService = ServiceGenerator
            .createService(applicationContext, MyAPIService::class.java) …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-room android-workmanager

8
推荐指数
0
解决办法
1347
查看次数

LiveData 是抽象的 android

我尝试初始化我的 LiveData 对象,但它给出了错误:“LiveData 是抽象的,无法实例化”

LiveData listLiveData = new LiveData<>();

android android-livedata android-architecture-components

7
推荐指数
2
解决办法
3328
查看次数

ViewModel 中的 LiveData 如何使用 Transformations 观察 Repository 中的 LiveData?

我在我的存储库中使用了一个 AsyncTask,它用于在存储库中设置 LiveData。如何使用转换从我的 ViewModel 观察这个 LiveData?

android android-asynctask android-livedata android-architecture-components

6
推荐指数
1
解决办法
4572
查看次数

避免从WorkManager复制PeriodicWorkRequest

在应用程序启动时,我想启动将永久工作的服务,但是当用户再次打开应用程序时,它会重复.

PeriodicWorkRequest.Builder sendDataBuilder = new PeriodicWorkRequest.Builder(SendConnectionMetricsWorker.class, Constants.REPEAT_TIME_INTERVAL_IN_HOURS, Constants.REPEAT_TIME_INTERVAL_UNITS)
                .setConstraints(new Constraints.Builder()
                        .setRequiredNetworkType(NetworkType.CONNECTED)
                        .build());
        PeriodicWorkRequest periodicWorkRequest = sendDataBuilder
                .build();
        WorkManager.getInstance().enqueue(periodicWorkRequest);
Run Code Online (Sandbox Code Playgroud)

android android-workmanager

6
推荐指数
1
解决办法
2884
查看次数

LiveData 小部件生命周期是否知晓?

我一直在探索 android 的架构组件。我不确定是否可以将架构组件与小部件生命周期一起使用。我浏览了很多,但没有可用的信息,如果我们可以使用LiveData和其他架构组件,如带有小部件的 View-Model?如果是,那么这样做的正确方法是什么?

android android-livedata android-architecture-components

5
推荐指数
0
解决办法
576
查看次数

Android Jetpack:设置 LiveData 时 RecyclerView 不会更新

所以我有一个简单的实现来在 a 中显示用户列表RecyclerView,并在ViewModelas 中查询该列表LiveData

问题是 UI 没有更新以显示最新的列表 - 称为users- 即使观察到该列表。我现在只是设置了一个演示用户列表。

这是我的视图模型:

class MainViewModel : ViewModel() {

    private val demoData = listOf(
            User(userName = "Bob", favoriteColor = "Green"),
            User(userName = "Jim", favoriteColor = "Red"),
            User(userName = "Park", favoriteColor = "Blue"),
            User(userName = "Tom", favoriteColor = "Yellow"),
            User(userName = "Lee", favoriteColor = "Black"),
            User(userName = "Xiu", favoriteColor = "Gray")
    )

    private val _users = MutableLiveData<List<User>>()
    val users: LiveData<List<User>>
        get() = _users

    init {
        _users.value …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-recyclerview android-livedata android-jetpack

5
推荐指数
1
解决办法
3948
查看次数

与Room&LiveData的多对多关系

我有一个休息api,它返回一个地方列表,其中包含一个类别列表:

{
      "id": "35fds-45sdgk-fsd87",
      "name" : "My awesome place",
       "categories" : [
          {
            "id": "cat1",
            "name" : "Category 1"
          },
          {
            "id": "cat2",
            "name" : "Category 2"
          },
          {
            "id": "cat3",
            "name" : "Category 3"
          }
       ]
}
Run Code Online (Sandbox Code Playgroud)

因此,使用改造我从远程服务器获取这些模型类:

data class Category(var id: String, var name: String)

data class Place(
  var id: String,
  var name: String,
  var categories: List<Category>
)
Run Code Online (Sandbox Code Playgroud)

问题是 - 我希望viewModel始终从返回Flowables的本地Room数据库中检索,并且只触发将更新数据库以及视图的刷新操作.

DAO方法示例:

@Query("select * from Places where placeId = :id")
fun getPlace(id: String): Flowable<Place>
Run Code Online (Sandbox Code Playgroud)

所以我尝试像这样建模这两个类:

@Entity
data class …
Run Code Online (Sandbox Code Playgroud)

android retrofit rx-java2 android-room android-livedata

5
推荐指数
1
解决办法
1638
查看次数