随着Android体系结构组件的稳定,我开始将所有基本ViewModel的更新到新的实现ViewModel.根据我的理解,LiveData建议使用它来保存Model类,因为它更好地处理生命周期.
我喜欢使用Data Binding它,因为它使代码在Java/Kotlin方面更清晰,并且不需要"观察"值更改来更新UI.但是,Data Binding如果Model(或ViewModel)扩展BaseObservable,LiveData则仅使用监视数据的布局会发生变化.我理解的主要目标之一LiveData是以编程方式观察和更新UI,但对于简单的更新,Data Binding非常有用.
这个问题已经报道过(GitHub和Stack Overflow),并且首先说版本1.0会有它,现在据说这个功能正在开发中.
为了同时使用LiveData和Data 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
我的项目中有一个复杂的屏幕,我打破了多个片段.我正在尝试遵循这些类的MVVM架构,因此哪个片段有自己的ViewModelContract类.
问题是所有ViewModel都需要相同的对象实例(让我们称之为Book)来进行Room事务.
它是否有正确的方法LiveData在ViewModels之间共享数据(或)?我知道共享ViewModel的概念,但我不知道是否可以将它应用于此案例.我也想过使用,MediatorLiveData但也没有得到一个好的方法.
我正在考虑BookObservableProvider使用LiveData<Book>(或Rx Subject<Book>)一个类(让我们调用),其中每个ViewModel注入相同的实例并且加载/更新总是相同的值.
这是一个好方法吗?
我正在使用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?
我正在使用Android Room并Rx 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
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
关于依赖注入的研究我发现一些方法建议注入所有东西,而另一些方法则说没有必要这样做.
在我目前的项目中,关于依赖注入的经验法则是" 如果该类是由我创建的,那么我可以将其注入 ".换句话说只有类喜欢SimpleDateFormat,ArrayList,HashMap是在我的项目newables.我的意图这样做的方法是,我可以@Inject任意类的任意一次调用Injector.getApplicationComponent().inject(this)的Activity.基本上我的所有类都有一个非args构造函数@Inject.
我主要使用DI,因为我认为一旦newDagger生成的类专门使用运算符,它将改善性能和内存使用.但我读了Dagger 1开发人员的帖子,说DI对性能没有影响,用法基本上是为了减少样板.
第一个问题是:
我的项目运行没有问题,我认为"注入一切"的方法有助于更好地组织,尽管有一些缺点.
使用此方法的一个示例是以下类:
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)
第二个问题是:
如果第二个问题的答案是"否",那么有一种更好的方法来处理非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) android ×5
android-mvvm ×2
alarmmanager ×1
android-architecture-components ×1
android-room ×1
dagger-2 ×1
java ×1
kotlin ×1
rx-android ×1
rx-java ×1