在使用WorkManager的时候,有时候需要关注任务执行的结果和状态,可以使用

LiveData<WorkInfo> liveOpStatus = WorkManager.getInstance(context)
.getWorkInfoByIdLiveData(request.getId());
得到一个WorkInfo的LiveData,然后观察它的任务的执行状态及返回结果。这里有一个问题,LiveData的observer需要两个参数,一个是LifecycleOwner,另一个是Observer<? super T> observer。observer是处理任务状态的函数,这个好办。
LifecycleOwner就比较麻烦一点,除非我们是在Activity或者Fragment中,否则就没有LifecycleOwner,比如在一个单例中,我想到两个办法:
一个是使用全局的生命周期,
ProcessLifecycleOwner.get()
这个需要引用一个库
implementation 'androidx.lifecycle:lifecycle-process:2.2.0-alpha04'
或者是自己构造一个LifecycleOwner,这个想法比较奇葩,但是我试过可以用
new LifecycleOwner(){
@NonNull
@Override
public Lifecycle getLifecycle() {
return new Lifecycle() {
@Override
public void addObserver(@NonNull LifecycleObserver observer) { } @Override
public void removeObserver(@NonNull LifecycleObserver observer) { } @NonNull
@Override
public State getCurrentState() {
return State.CREATED;
}
};
}
};

用法写完了,但是我用的时候总感觉哪地方不太对,因为我觉得observer用完之后 没有removeObserver,心里总觉得不太爽,于是我找到了另一个用法,比如在单例模式下,定义一个全局的MediatorLiveData

final MediatorLiveData<WorkInfo> liveWorkStatus = new MediatorLiveData<>();

每次执行任务的时候把它的观察对象liveOpStatus放到liveWorkStatus中

liveWorkStatus.addSource(liveOpStatus, new Observer<WorkInfo>() {
@Override
public void onChanged(WorkInfo workInfo) {
liveWorkStatus.setValue(workInfo);
WorkInfo.State state = workInfo.getState();
if (state.isFinished()) {
liveWorkStatus.removeSource(liveOpStatus);
}
}
});

每次执行完任务就把这个LiveData从全局的观察对对象中删除掉。而单例对象是和进程同生共死的,所以可以用全局的LifecycleOwner,也就是ProcessLifecycleOwner。

还有一个比较有意思的东西,回头再写出来。

参考https://www.codota.com/web/assistant/code/rs/5c7c468fac38dc0001e26004#L30

												

Android Jetpack之WorkManager: 观察结果的更多相关文章

  1. 学习Android Jetpack? 入门教程和进阶实战这里全都有!

    前言 2018年谷歌I/O,Jetpack横空出世,官方介绍如下: Jetpack 是一套库.工具和指南,可帮助开发者更轻松地编写优质应用.这些组件可帮助您遵循最佳做法.让您摆脱编写样板代码的工作并简 ...

  2. 带你了解Android Jetpack

    1.Jetpack主要特性有以下三点: 1.加速开发组件可单独使用,也可以协同工作,当使用kotlin语言特性时,可以提高效率. 2.消除样板代码Android Jetpack可管理繁琐的Activi ...

  3. Android Jetpack组件

    带你领略Android Jetpack组件的魅力 Android新框架jetpack的内容讲解:Room.WorkManager.LifeCycles.LiveData.ViewModel.DataB ...

  4. Android Jetpack之AppCompat(一)

    今天我们来聊一聊有关AppCompat,作为Android Jetpack系列文章的开篇.说到Android Jetpack,我们先看一下这张图: 从图中我们可以看到,整个Android Jetpac ...

  5. Android Jetpack 组建介绍(二)——Lifecycler

    参考Android Jetpack架构组件之 Lifecycle(源码篇) 源码分析 关于Lifecycle的使用考上一篇文章Android Jetpack框架之 Lifecycles(使用篇),从使 ...

  6. Android Jetpack 组建介绍(一)——Lifecycler

    转自带你领略Android Jetpack组件的魅力 Android Jetpack 对于任何一个产品来说,我们开发中都会面对哪些问题?如:产品交互.用户体验.代码结构.数据获取.数据存储.网络优化. ...

  7. Android Jetpack 概述

    Android Jetpack Overview Android Jetpack Jetpack is a set of libraries, tools and architectural guid ...

  8. Android Jetpack - 使用 Navigation 管理页面跳转

    在今年的 IO 大会上,发布了一套叫 Android Jetpack 的程序库.Android Jetpack 里的组件大部分我们都接触过了,其中也有一些全新的组件,其中一个就是 Navigation ...

  9. Android Jetpack组件之Lifecycles库详解

    Android Jetpack 组件是库的集合,这些库是为了协同工作而构建的,不过也可以单独采用,接下来会一一详细地学习这些库, 下面源码版本是com.android.support:appcompa ...

随机推荐

  1. centos6里面装zabbix(二)

    第一步: 如果这一步的时候有错误,那么修改php.ini(/usr/local/php/etc/这个目录下),然后重启php这个配置文件. 第二步: 第三步: 第四步: 第五步: 第六步:做到这一步的 ...

  2. intellij import包 顺序调整

    intellij中自动import的包顺序与eclipse不太一致,可以参照以下方式进行调整: eclipse中(笔者用的是eclipse luna)导入包的顺序依次是: javajavaxorgco ...

  3. golang实现生产者消费者模型

    生产者消费者模型分析 操作系统中的经典模型,由若干个消费者和生产者,消费者消耗系统资源,生产者创造系统资源,资源的数量要保持在一个合理范围(小于数量上限,大约0).而消费者和生产者是通过并发或并行方式 ...

  4. MYSQL理论学习

    最近在复习数据库相关的知识,主要是以“SQL必知必会”这本书为参考,结合网上相关博客,记录学习的要点.本篇博客会持续更新,便于以后复习. 参考博客:http://blog4jimmy.com/2017 ...

  5. CentOS里查看内存的使用

    转自 http://blog.csdn.net/blueman2012/article/details/6904597

  6. Markov logic network

    A Markov logic network (or MLN) is a probabilistic logic which applies the ideas of a Markov network ...

  7. Python C/S架构,网络通信相关名词,socket编程

    主要内容: 一.  C/S架构 二. 网络通信的相关名词 三. socket编程 一. C/S架构和B\S架构概述 1. C/S架构: Client/Server(客户端/服务端)架构 描述: C/S ...

  8. MySQL知识点系统总结

    MySQL数据库是一个非常流行的关系型数据库.配合Linux.PHP.Apache,简称lamp,是一般个人企业网站的首选.MySQL用起来不难,要系统的用好,可不是一件简单的事.于是PHP程序员雷雪 ...

  9. eNSP路由器输出 '#' 无法启动的一种解决方法

    试过网上的改virtulboxIP.关防火墙.改兼容性等方法,都不成功.后来发现通过改变选择路由器的型号可以启动. 如果对路由器没有特殊需求,可以选择型号数字较小的试一下(最低可以选择Router).

  10. beam search 和 greedy search

    贪心搜索(greedy search): 贪心搜索最为简单,直接选择每个输出的最大概率,直到出现终结符或最大句子长度. 集束搜索(beam search): 集束搜索可以认为是维特比算法的贪心形式,在 ...