在使用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. 005-文件权限解说、授权chmod和chown命令的用法

    一.文件权限说明 1.1.linux 中 drwxr-xr-x权限含义 在 linux drwxr-xr-x意思如下: 第一位表示文件类型.d是目录文件,l是链接文件,-是普通文件,p是管道. 后面的 ...

  2. 一百一十二:CMS系统之前台用户模型

    安装shortuuid用于前台用户的主键:pip install shortuuid 创建模型 from datetime import datetimeimport enumfrom werkzeu ...

  3. c语言数组在作为参数传递时注意事项

    1.不能在[]给定大小 2.不要在被调用函数里使用sizeof(a)/sizeof(a[0])形式传递数组大小,直接给出数组长度,或者在 主调函数中使用sizeof(a)/sizeof(a[0])传递 ...

  4. Java日志体系(五)logback

    1.1 简介 师出同门,与log4j一样,logback也是由Ceki Gülcü开发的开源日志组件,可以说是log4j的改进版:在现如今的项目中,logback的出现次数越来越多,是目前主流首选的日 ...

  5. mysql8修改密码问题

    查看初始密码: grep "temporary password" /var/log/mysqld.log 查看validate_password变量 SHOW VARIABLES ...

  6. React Native初始化项目后执行react-native run-ios,构建失败

    今天是肿么了......一上班创建React Native项目,react-native run-ios运行就报错,运行不了...呜呜...... 一开始以为自己react-native run-io ...

  7. Product - 产品经理 - 转型

    特别说明 本文是已读书籍的学习笔记和内容摘要,原文内容有少部分改动,并添加一些相关信息,但总体不影响原文表达. - ISBN: 9787568041591 - https://book.douban. ...

  8. 20190903 - CSDN 的奇葩替换

    可能是出于安全原因 CSDN 对内容中的代码,作了很多奇葩的替换. 比如下面两行,是否有差别? # - # -16 有.其实 cut 后的短横线,内部编码不同,前者复制后无法被识别. 再比如下面两个词 ...

  9. ASP.NET Core 入门笔记9,ASP.NET Core + Entity Framework Core 数据访问入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC 集成 EF Core 介绍&操作步骤 ASP.NET Core MVC 使用 EF Core + Linq to Entity ...

  10. 让样式文件,或js文件的相对路径,变成成绝对路径

    添加两行代码即可 <% String path = request.getContextPath(); String basePath = request.getScheme() + " ...