如何在 Kotlin 中将 Fuel 与协程一起使用?

2024-04-13

我想获取 API 请求并将请求的数据保存到数据库。还想返回数据(即写入数据库)。我知道,这在 RxJava 中是可能的,但现在我用 Kotlin 协程编写,目前使用 Fuel 而不是 Retrofit (但差异不是那么大)。我读如何将 Fuel 与 Kotlin 协程一起使用 https://stackoverflow.com/questions/50402433/how-to-use-fuel-with-a-kotlin-coroutine,但不明白。

如何编写协程和方法?

UPDATE

比如说,我们有 Java 和 Retrofit,RxJava。然后我们就可以写代码了。

地区响应:

@AutoValue
public abstract class RegionResponse {
    @SerializedName("id")
    public abstract Integer id;
    @SerializedName("name")
    public abstract String name;
    @SerializedName("countryId")
    public abstract Integer countryId();

    public static RegionResponse create(int id, String name, int countryId) {
        ....
    }
    ...
}

Region:

data class Region(
    val id: Int,
    val name: String,
    val countryId: Int)

Network:

public Single<List<RegionResponse>> getRegions() {
    return api.getRegions();
    // @GET("/regions")
    // Single<List<RegionResponse>> getRegions();
}

区域存储库:

fun getRegion(countryId: Int): Single<Region> {
    val dbSource = db.getRegion(countryId)
    val lazyApiSource = Single.defer { api.regions }
            .flattenAsFlowable { it }
            .map { apiMapper.map(it) }
            .toList()
            .doOnSuccess { db.updateRegions(it) }
            .flattenAsFlowable { it }
            .filter({ it.countryId == countryId })
            .singleOrError()
    return dbSource
            .map { dbMapper.map(it) }
            .switchIfEmpty(lazyApiSource)
}

区域交互器:

class RegionInteractor(
    private val repo: RegionRepository,
    private val prefsRepository: PrefsRepository) {

    fun getRegion(): Single<Region> {
        return Single.fromCallable { prefsRepository.countryId }
                .flatMap { repo.getRegion(it) }
                .subscribeOn(Schedulers.io())
    }
}

我们一层一层看。

首先,你的RegionResponse and Region据我所知,对于这个用例来说完全没问题,所以我们根本不会碰它们。

您的网络层是用 Java 编写的,因此我们假设它始终期望同步行为,并且也不会触及它。

因此,我们从存储库开始:

fun getRegion(countryId: Int) = async {
    val regionFromDb = db.getRegion(countryId)

    if (regionFromDb == null) {
        return apiMapper.map(api.regions).
                  filter({ it.countryId == countryId }).
                  first().
           also {
           db.updateRegions(it)
        }
    }

    return dbMapper.map(regionFromDb)
}

请记住,我没有您的代码,因此细节可能会有所不同。但协程的总体思路是,您可以使用以下命令启动它们async()如果他们需要返回结果,然后编写代码,就好像您处于完美的世界中,无需关心并发性。

现在对于交互者:

class RegionInteractor(
    private val repo: RegionRepository,
    private val prefsRepository: PrefsRepository) {

    fun getRegion() = withContext(Schedulers.io().asCoroutineDispatcher()) {
        val countryId = prefsRepository.countryId
        return repo.getRegion(countryId).await()
    }
}

您需要一些东西来将异步代码转换回同步代码。为此,您需要某种线程池来执行。这里我们使用 Rx 中的线程池,但如果您想使用其他池,也可以这样做。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Kotlin 中将 Fuel 与协程一起使用? 的相关文章

  • 如何在android中将多个图像合并为一个图像?

    我正在开发 android 的分布式应用程序 我已将单个图像分成 4 个部分 然后对其进行处理 现在我想将 4 个位图图像组合成一个图像 我怎样才能做到这一点 Bitmap parts new Bitmap 4 Bitmap result
  • Robolectric 1.2:“警告:无法找到 Android SDK 的路径”

    I used Robolectric 1 1 jar 与依赖项 在我的项目中并成功使其工作 但是当我将罐子更改为 1 2 SNAPSHOT jar 与依赖项 我收到以下警告 警告 无法找到 Android SDK 的路径 两个jar包都下载
  • 如何在 Kotlin 中强制执行空的非空字符串?

    我经常想保存一个不能为空的字符串or blank 空白不够好 编译器处理String 很好地防止 null 我们可以使用aNullableString isNullOrBlank 检查它是否为空或空白 但是 这要求在使用空白支票的所有地方都
  • Android 上的嵌套滚动

    我们的活动中有一个主要的水平滚动视图 以及嵌套在其中的几个垂直滚动视图 这个想法是水平滚动 直到找到所需的垂直列表 然后上下滚动 理想情况下 一旦开始垂直滚动 我希望垂直滚动具有 锁定 现在会发生什么 如果您非常小心 您可以垂直滚动 但如果
  • Android - 如何设置所有屏幕的背景颜色?

    维护字体和颜色样式的最佳实践是什么 我制作了一个 color xml 文件 用于更改按钮等单独元素的颜色 但我不确定 Android 希望开发人员如何组织他们的样式 例如 我希望所有屏幕都具有相同的背景颜色 我怎么做 我需要为每个 Acti
  • Android Fragment 中的 SharedPreferences

    我正在尝试读取 Fragment 内的 SharedPreferences 我的代码用于获取任何其他活动中的首选项 SharedPreferences preferences getSharedPreferences pref 0 我收到错
  • 如何实现可运行队列

    我正在尝试实现一个可运行队列 在异步任务期间依次执行 意味着队列中的下一个将在另一个完成后执行 我编写了一个管理器来管理这些可运行对象和本身就是可运行对象的任务 然后 我获取异步任务中的第一个任务并运行它 希望它能够在队列中运行 但是它最终
  • Android“权限拒绝:无法使用相机”

    我正在学习有关在 Android 应用程序中使用相机的教程 我收到错误 权限被拒绝 无法使用相机 在模拟器和物理设备上运行调试时 我在清单文件中尝试了各种权限 似乎大多数遇到此错误的人都遇到了拼写错误 缺少权限或权限不在清单中的正确位置 这
  • GpsStatusListener:尽管状态为 GpsStatus.GPS_EVENT_FIRST_FIX,但修复中未使用卫星

    我向我的位置管理器添加了一个 GPS 状态侦听器 以便查看何时获得第一个修复 当我收到 GPS EVENT FIRST FIX 时 我会循环遍历所有卫星 但为什么修复中没有使用它们 usedInFix 我的日志对所有卫星都显示 错误 fin
  • Android 原生 AAssetManager 的文件层次结构

    Issue 我想知道如何从本机代码创建 Android 中资产文件夹的文件层次结构 我在用着AAssetManager openDir but AAssetDir getNextFileName不返回任何目录名称 因此基本上我无法深入了解层
  • 设置 ViewGroup 的最大宽度

    如何设置 ViewGroup 的最大宽度 我正在使用一个Theme Dialog然而 当调整大小到更大的屏幕时 它看起来不太好 它也有点轻量级 我不希望它占据整个屏幕 I tried 这个建议 https stackoverflow com
  • 当我单击 GridView 项时返回 ImageView 实例

    当我点击GridView项时如何返回ImageView实例 我为 ItemClick 创建自定义绑定事件 public class ItemClickSquareBinding MvxBaseAndroidTargetBinding pri
  • 如果从超链接打开,应用程序将启动两次

    我正在开发一个应用程序 可以从多个地方启动 例如日历中的超链接 我在以下场景中面临问题 如果应用程序已启动并在后台运行 并且用户单击本机日历中的事件 超链接来启动应用程序 我的应用程序作为新实例启动两次 在正在运行的应用程序列表中 我可以看
  • 过滤列表视图并获取正确的 onclick 项目

    我有一个列表视图 并且已经实现了过滤 假设我有项目 A B 和 C 如果我在过滤框中输入 B 则只会显示项目 B 它是列表的位置 0 之前位于位置 1 因此 当我调用 onClick 项目时 我得到 id position 0 这导致显示有
  • 以编程方式卸载 Android 应用程序

    我希望能够允许我的用户从我的应用程序中卸载应用程序 就像 Google Play 商店允许其用户一样 请下图 主要问题是如何定义一个按钮 按下它我们可以通过提供包名称或其他一些信息来卸载应用程序 就像图像上的卸载按钮一样 try Inten
  • XML 文档结构必须在同一实体内开始和结束

    我是 eclipse 的新手 我刚刚开始编写一些代码 实际上只是从网站复制并粘贴 谁能帮我解决这个问题 错误出现在最后一行
  • Android appwidget 远程视图未更新

    当我从某些活动更新小部件时 列表远程视图不会更新 我的意思是刷新自身 它会出现直到应用程序小部件的更新 日志显示 但不会进入列表视图的适配器以用新数据填充它 public void onUpdate Context context AppW
  • Android smoothScrollTo 不调用 onScrollStateChanged

    我在用smoothScrollBy 滚动到 a 中的特定位置ListView 我希望在以下情况时得到通知ListView完成滚动以将其与当前集成onScrollStateChanged 当用户用手指滚动时触发的事件 目前我正在使用Timer
  • Flutter 中 Android RecyclerView.SCROLL STATE IDLE 的等价物是什么

    Android 给出的滚动状态如下RecyclerView SCROLL STATE IDLE它告诉用户何时停止滚动 我找不到任何选择在颤动中Pageview or ListView滚动监听器 我的问题 我需要检测 PageView 中的向
  • 从 NDK 获取应用程序名称

    我需要从本机端获取我的 Android 应用程序的名称 如下所示 android content context context android content context this current activiy Resources

随机推荐

  • Canvas 类绘图基元的除法独立性

    Android Canvas 类支持一组丰富的绘图基元 圆 线等 我有一个应用程序使用这些图元来绘制一些统计数据 阅读完相关说明后http developer android com reference android graphics C
  • 在node_modules/dojo/dojo.js的resolveDepMaps()中出现“TypeError: deps.map is not a function”

    我一直在更改我的组织的底层基础设施 以将我们的自动化测试从使用单独的 Web 服务器在浏览器客户端中运行切换到在测试运行程序 实习运行程序 中运行 在测试运行器环境中 一切进展顺利 我解决了很多问题 但随后繁荣起来 有人删除了一个新的单元测
  • 如何创建一个值超过允许的最大整数的枚举?

    我正在 C 中创建一个枚举 以使用二进制标志创建一个有限状态机 看起来像 enum VStates NEUTRAL 0x00000000 000000 Physical Status DRY 0x00000001 000001 WET 0x
  • Java Web 服务 - Axis 是必要的吗?

    Is AXIS or CXFJava Web 服务必需吗 这一切都可以通过 JDK 1 6 完成吗 Java Web 服务需要 AXIS 或 CXF 吗 不 虽然Axis2 http ws apache org axis2 是使用 Web
  • 如何设计“冰淇淋三明治”选项卡之间的分隔线样式?

    我将以下样式与一组九个补丁图像一起使用 在一些冰淇淋三明治选项卡的底部创建一条红线 而不是标准的蓝线
  • 在c#中将未命名的json数组反序列化为对象

    想知道如何在 C 中反序列化以下字符串 access token thisistheaccesstoken 如果 json 是 我知道该怎么做 array access token thisistheaccesstoken 我会这样做 pu
  • java 注释:用 xml 文件覆盖注释的库

    Java 有注释 这很好 然而 一些开发人员认为最好使用 xml 文件用元数据注释代码 其他开发人员更喜欢注释 但会使用元数据覆盖源代码中的注释 我正在编写一个使用注释的 Java 框架 问题是 是否有一种标准方法来定义和解析 xml 文件
  • 处理回调

    我在 Objective C 类中有一个方法 它有 2 个用 C 编写的回调函数 类指针 即self被传递给这些函数作为void 在 C 函数中 我创建一个类型为 class 的指针并分配void 范围 第一个回调函数执行成功 但是void
  • 使用 FFMPEG 播放音频

    我一直在尝试使用 NDK 将 FFMPEG 用于播放音频 移植到 Android 中 我取得了一些成功 我可以构建 FFMPEG 并通过 NDK 链接它 我可以打电话avcodec decode audio3 并解码给定的音频文件 所以这里
  • java并发hashmap

    这似乎是错误的 static ConcurrentHashMap k multiple threads have access to k X o k get LL o a 6 如果多个线程同时访问 k 并获取 k LL 然后在没有 k pu
  • 使用 glassfish 4 和 Postgres 在 eclipselink 中创建数据库不起作用

    我想创建基于实体的数据库 配置 Glassfish GlassFish 服务器开源版 4 1 版本 13 Eclipselink Eclipse 持久性服务 2 5 2 v20140319 9ad6abd 随 glassfish 提供 数据
  • Python:PDF:如何读取带有单选按钮的表单

    我创建了一个带有一些单选按钮的表单 遵循以下示例使用 Python 在 ReportLab 中创建交互式 PDF 表单 https www blog pythonlibrary org 2018 05 29 creating interac
  • sublimegdb 无法停在断点处

    我在 sublime text 2 中安装了 sublimeGDB 并且我的设置是正确的 然后我在一行中按 F9 设置断点 当我按F5运行时 我发现我的程序无法停在断点处 并且程序运行完毕 下面显示的信息是 GDB session结束 GD
  • UITapGestureRecognizer 不适用于 .began 状态

    我在我的应用程序中添加了两个手势识别器UIView func tap sender UITapGestureRecognizer if sender state began print snapping photo func longPre
  • 服务器操作的 Node.js 客户端进度指示器

    我的 Node js 服务器将对上传的文件执行某些操作 我想将近乎实时的进度反映给客户端 此操作大约需要 30 秒 1 分钟才能完成 理想情况下 文件上传后 客户端将能够观察服务器对文件操作的进度 我可以执行常规轮询 长轮询 或者通过 we
  • 如何在会话中存储石英作业的结果?

    我已经在 Grails 2 1 应用程序中安装了 Quartz 插件 每 5 分钟就会触发一个作业来计算一些数字 这些数字显示在每个页面的侧栏上 计算结果会经常变化 我的目标是当用户刷新屏幕时 他们可以在侧边栏上看到新结果 现在我的方法是将
  • php 中的 git post-receive 挂钩

    我希望能够在 post receive 挂钩上执行 php 挂钩 将文件从 git 存储库复制到同一服务器上的 web 文件夹 并且只有在主分支上推送文件时才运行 忽略其他分支 以下是我到目前为止所得到的 usr bin php 基本上 我
  • 如何从生成的sql返回本地临时表

    我有过滤 SQL 它返回列数不确定的查询 并希望在存储过程中使用结果 DECLARE RecordSelectionSql VARCHAR MAX SET RecordSelectionSql SELECT SQLQUERY FROM Re
  • 创建 tar 文件并按当前日期命名

    我正在尝试在 bash 中创建一个备份脚本 以 tar 压缩文件夹的内容并将生成的文件移动到某处 但我真的不知道该怎么做 bin bash name date y m d tar zcvf name code 但结果是文件只是命名为 y m
  • 如何在 Kotlin 中将 Fuel 与协程一起使用?

    我想获取 API 请求并将请求的数据保存到数据库 还想返回数据 即写入数据库 我知道 这在 RxJava 中是可能的 但现在我用 Kotlin 协程编写 目前使用 Fuel 而不是 Retrofit 但差异不是那么大 我读如何将 Fuel