【发布时间】:2021-10-18 14:37:44
【问题描述】:
我正在构建一个离线第一个聊天应用程序,因此我使用Workmanager 来处理POST 发送聊天消息的请求。
我正在学习 android 开发,所以我需要一些关于构建聊天消息上传的帮助
当前实现
当需要发布新的聊天消息时,客户端会执行以下操作
- 使用带有新 UUID 的 Room 将聊天保存到 SQLite
- 启动工作经理
unique work来发布此消息 - 这样我可以确保当客户端有互联网时消息最终会发布
这是理想的吗?我发现了一些问题。
- 我开始的工人太多了。每条消息都有一个工作请求。
- 发布到服务器的消息的年表丢失。
更好的实现
- POST 消息的单个唯一工作人员。这将获取所有离线消息并以正确的顺序发布它们
还是不理想
这些实现的问题是:
- 一旦开始,您对工作的控制权就很小(不是那么容易)。
- 如果工作失败,我们设置了退避时间。因此,当要发送新消息时,我们需要用新的工作请求替换旧的工作人员。这似乎并不理想。
我们正在改变工作人员,而不是向队列追加新任务。
- 我们不能在每个消息实现中使用一个工人,因为我们松散了年表并且工人太多
这是一个分布式系统问题。
- 我们正在启动工作人员,他们应该独立于应用程序的生命周期工作
- 工人应该在他们死亡的情况下活着回来(已经由
android-workmanager管理) - 工作人员应该从要执行的任务队列中读取(这是我正在寻找的)
- 应该有一个持久性存储充当工作人员的队列
- 应该有一个服务或工厂在需要时调用工人(我们在当前的 impl 中没有这个)
问题
- 当客户端有互联网时,是否有更好的方法将离线消息发布到服务器?喜欢服务?
- 是否有这样做的社区构建库?
- 当前的实现可以扩展到文件吗?
- 我需要long running workers
- 或者可以使用这个库 - android-upload-service
【问题讨论】:
-
您可以使用 workmanager,但您需要房间数据库中的密钥 isSent - false。如果网络通过工作管理器或服务(根据您的意愿进行交流)连接命中后请求,但当您获得成功时,请更新 isSent - true,因此在建立连接时无法再次发送
-
@DeePanShu 是的,我已经在这样做了。而且我也已经实现了“一个工人来做所有的帖子”。但我的问题是是否有更好的方法。我将更改为什么我认为当前的实现不令人满意的问题。
-
@clmno 您使用的是哪种语言?这是必需的,因此我可以用该语言发布答案。
-
@VaibhavGoyal 我正在使用 Kotlin,但我不认为这取决于语言。这是一个 android 子系统问题。
-
@clmno a/c 据我所知,我认为没有令人满意的实现,因为当我们在应用中实现聊天时,最好的优化总是实时框架。
标签: android android-workmanager