小编Igo*_*dro的帖子

将LiveData与数据绑定结合使用

随着Android体系结构组件的稳定,我开始将所有基本ViewModel的更新到新的实现ViewModel.根据我的理解,LiveData建议使用它来保存Model类,因为它更好地处理生命周期.

我喜欢使用Data Binding它,因为它使代码在Java/Kotlin方面更清晰,并且不需要"观察"值更改来更新UI.但是,Data Binding如果Model(或ViewModel)扩展BaseObservable,LiveData则仅使用监视数据的布局会发生变化.我理解的主要目标之一LiveData是以编程方式观察和更新UI,但对于简单的更新,Data Binding非常有用.

这个问题已经报道过(GitHubStack Overflow),并且首先说版本1.0会有它,现在据说这个功能正在开发中.

为了同时使用LiveDataData Binding,我创建了一个非常简单的类实现,它扩展了BaseObservable:

import android.arch.lifecycle.LiveData
import android.arch.lifecycle.MutableLiveData
import android.databinding.BaseObservable

class ObservableMutableLiveData<T>() : BaseObservable() {

    private var data: MutableLiveData<T> = MutableLiveData()

    constructor(data: T) : this() {
        this.data.value = data
    }

    public fun set(value: T) {
        if (value != data.value) {
            data.value = value …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-databinding android-mvvm android-architecture-components

22
推荐指数
2
解决办法
1万
查看次数

在ViewModels之间共享数据

我的项目中有一个复杂的屏幕,我打破了多个片段.我正在尝试遵循这些类的MVVM架构,因此哪个片段有自己的ViewModelContract类.

问题是所有ViewModel都需要相同的对象实例(让我们称之为Book)来进行Room事务.

它是否有正确的方法LiveData在ViewModels之间共享数据(或)?我知道共享ViewModel的概念,但我不知道是否可以将它应用于此案例.我也想过使用,MediatorLiveData但也没有得到一个好的方法.

我正在考虑BookObservableProvider使用LiveData<Book>(或Rx Subject<Book>)一个类(让我们调用),其中每个ViewModel注入相同的实例并且加载/更新总是相同的值.

这是一个好方法吗?

android android-mvvm android-livedata android-viewmodel

8
推荐指数
1
解决办法
706
查看次数

如何在 Kotlin Flow 中过滤列表

我正在使用RxJavatoCoroutines和替换我当前的实现Flow。我在使用某些Flow运算符时遇到了一些问题。

我试图Flow在提供它以被收集之前过滤 a 中的项目列表。( Flow<List<TaskWithCategory>>)

以下是示例Rx2

        repository.findAllTasksWithCategory()
            .flatMap {
                Flowable.fromIterable(it)
                    .filter { item -> item.task.completed }
                    .toList()
                    .toFlowable()
Run Code Online (Sandbox Code Playgroud)

在上面的实现中,我提供了一个已经完成的TaskWithCategory过滤列表Task

我怎样才能做到这一点Flow

kotlin-coroutines kotlinx.coroutines.flow

7
推荐指数
1
解决办法
4329
查看次数

RecyclerView ListAdapter 未正确更新列表

我正在使用Android RoomRx Flowable更新RecyclerView我的数据库中的对象。为了获得更好的动画和性能,我更新了项目以在我的项目中使用新的ListAdapter

问题是当用户按下CheckboxTask 对象更新为完成时,数据库会反映此更改,但有时适配器ListAdapter会通知我onBindViewHolder,有时它会说我的视图已更新。

任务列表片段

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    viewModel.loadTasks(onTasksLoaded = { adapter.submitList(it) })
}
Run Code Online (Sandbox Code Playgroud)

任务道

@Query("SELECT * FROM task")
fun getAllTasks(): Flowable<MutableList<Task>>
Run Code Online (Sandbox Code Playgroud)

任务列表适配器

class TaskListAdapter : ListAdapter<Task, BindingHolder<*>>(TaskDiffCallback()) {

    override fun onBindViewHolder(holder: BindingHolder<*>, position: Int) {
        val task = getItem(position)
        // more binding code

        // THE ISSUE IS HERE
        if (task.completed) {
            holder.viewStrike.visibility = View.VISIBLE
        } else {
            holder.viewStrike.visibility …
Run Code Online (Sandbox Code Playgroud)

android android-adapter rx-java android-recyclerview android-room

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

如何在WorkManager中配置Rx?

AlarmManager当用户向任务添加截止日期时,我实现了发送通知的功能。但是,当用户关闭设备时,所有警报都将丢失。现在,我正在更新,BroadcastReceiver以接收android.intent.action.BOOT_COMPLETED和重新设置为每个任务设置的所有警报。

我的第一个尝试是将Rx Single所有任务的到期日都高于当前时间BroadcastReceiver,然后重新计划所有警报。问题是Observable一旦BroadcastReceiver没有生命周期,我将无法处置。同样,这似乎不是一个好方法

在我的研究期间,IntentService对于这种情况,这是一个很好的解决方案,但是我进入了新WorkManager库,并且OneTimeWorkRequest看起来像是一个很好且简单的解决方案。

Worker被调用和执行正确,但我不能够处理的Observable,因为该onStopped方法不会被调用。

这是基于此代码段的实现

class TaskAlarmWorker(context: Context, params: WorkerParameters) :
    Worker(context, params), KoinComponent {

    private val daoRepository: DaoRepository by inject()

    private val compositeDisposable = CompositeDisposable()

    override fun doWork(): Result {
        Timber.d("doWork")

        val result = LinkedBlockingQueue<Result>()

        val disposable =
            daoRepository.getTaskDao().getAllTasks().applySchedulers().subscribe(
            { result.put(Result.SUCCESS) },
            { result.put(Result.FAILURE) }
        )

        compositeDisposable.add(disposable)

        return try …
Run Code Online (Sandbox Code Playgroud)

android alarmmanager intentservice rx-android android-workmanager

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

在Android中"注入一切"是一种不好的做法吗?

关于依赖注入的研究我发现一些方法建议注入所有东西,而另一些方法则说没有必要这样做.

在我目前的项目中,关于依赖注入的经验法则是" 如果该类是由我创建的,那么我可以将其注入 ".换句话说只有类喜欢SimpleDateFormat,ArrayList,HashMap是在我的项目newables.我的意图这样做的方法是,我可以@Inject任意类的任意一次调用Injector.getApplicationComponent().inject(this)Activity.基本上我的所有类都有一个非args构造函数@Inject.

我主要使用DI,因为我认为一旦newDagger生成的类专门使用运算符,它将改善性能和内存使用.但我读了Dagger 1开发人员的帖子,说DI对性能没有影响,用法基本上是为了减少样板.

第一个问题是:

  • Dagger 2在Android应用程序中没有任何性能优势?

我的项目运行没有问题,我认为"注入一切"的方法有助于更好地组织,尽管有一些缺点.

使用此方法的一个示例是以下类:

public class TimelineEntryAdapter {

@Inject
Provider<TwitterEntry> mTwitterProvider;

@Inject
Provider<InstagramEntry> mInstagramProvider;

@Inject
Provider<FacebookEntry> mFacebookProvider;

@Inject
TimelineEntryComparator mComparator;

@Inject
public TimelineEntryAdapter() {
}
Run Code Online (Sandbox Code Playgroud)

第二个问题是:

  • 在Android中注入所有东西是不好的做法?

如果第二个问题的答案是"否",那么有一种更好的方法来处理非args构造函数来创建类吗?因为当我创建一个带有@Inject注释的非args构造函数并且类需要一些参数来使用时,我必须使用setters:

public class SavelArtist {

private MusicBrainzArtist mMusicBrainzArtist;

private DiscogsArtist mDiscogsArtist;

private List<SavelTweet> mTweetList;

private SpotifyArtist mSpotifyArtist;

private List<SavelInstagram> mInstaTimeline; …
Run Code Online (Sandbox Code Playgroud)

java android dependency-injection dagger-2

3
推荐指数
1
解决办法
1145
查看次数