首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将工作管理器用作上载服务

如何将工作管理器用作上载服务
EN

Stack Overflow用户
提问于 2021-10-18 05:52:06
回答 1查看 634关注 0票数 1

我正在构建一个离线的第一个聊天应用程序,所以我使用Workmanager来处理发送聊天消息的POST请求。

我正在学习android开发,所以我需要一些关于建立聊天信息上传架构的帮助。

目前执行情况

当需要发布新的聊天消息时,客户端执行以下操作

  1. 使用带有新UUID的Room将聊天保存到SQLite
  2. 启动工作管理器unique work来发布此消息。
  3. 这样,我就可以确定,当客户端有internet时,消息最终会被发布。

这是理想吗?我看到了一些问题。

  1. 我开始的工人太多了。每个消息都有一个工作请求。
  2. 发送到服务器的消息的时间顺序丢失。

更好的实施

  1. 一个唯一的工作人员来发布消息。,它将获取所有脱机消息并按正确的顺序发送它们。

仍然不理想

这些执行的问题是:

  1. 一旦工作开始,你几乎控制不了它(不那么容易)。
    • 如果一项工作失败了,我们就设置了退避时间。因此,当要发送新消息时,我们需要用新的工作请求替换老员工。这看起来不太理想。

我们正在对工作人员进行变异,而不是将新任务附加到队列中。

代码语言:javascript
复制
- We can't use the one worker per message implementation because we loose chronology and there are too many workers

这是一个分布式系统问题。

  • 我们正在开始工作,他们应该独立于应用程序的生命周期。
  • 如果工人死了(已经由android-workmanager管理),他们应该活着回来。
  • 工作人员应该从要执行的任务队列中读取(这就是我要找的)。
  • 应该有一个为工人排队的持久商店。
  • 应该有一个服务或工厂在需要时调用工人(我们目前没有这种情况)。

问题

  1. 当客户端有internet时,是否有更好的方法将脱机消息发送到服务器?比如服务?
  2. 是否有这样的社区构建库?
  3. 当前实现可以缩放到文件吗?
EN

回答 1

Stack Overflow用户

发布于 2021-10-18 06:37:44

是的,您可以使用Service有效地同步消息,首先创建一个对象,该对象将从Live扩展,以获取网络更新的实时更新,

代码语言:javascript
复制
object NetworkState : LiveData<Boolean>() {

private lateinit var application: Application
private lateinit var networkRequest: NetworkRequest
private lateinit var connectivityManager: ConnectivityManager

fun init(application: Application) {
    this.application = application
    connectivityManager = application.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    networkRequest = NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        .build()
}

override fun onActive() {
    super.onActive()
    getDetails()
}

private fun getDetails() {

    connectivityManager.registerNetworkCallback(networkRequest, object : ConnectivityManager.NetworkCallback() {

        override fun onAvailable(network: Network) {
            super.onAvailable(network)
            postValue(true)
        }

        override fun onLost(network: Network) {
            super.onLost(network)
            postValue(false)
        }

        override fun onUnavailable() {
            super.onUnavailable()
            postValue(false)
        }
    })
}

然后在应用程序类中像这样初始化它,

代码语言:javascript
复制
@HiltAndroidApp
class BaseApplication : Application(), Configuration.Provider {

@Inject
lateinit var workerFactory: HiltWorkerFactory

override fun getWorkManagerConfiguration() =
    Configuration.Builder()
        .setWorkerFactory(workerFactory)
        .build()

override fun onCreate() {
    super.onCreate()
    NetworkState.init(this)
    if (BuildConfig.DEBUG){
        Timber.plant(Timber.DebugTree())
    }
}
}

现在,您可以创建一个服务类,它将从Lifecycle扩展,并观察那里更新的网络。当Live发出值true时,您可以检查是否有需要在线同步的消息。但请记住,只有当应用程序处于前台时,它才能工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69611355

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档