我正在构建一个离线的第一个聊天应用程序,所以我使用Workmanager来处理发送聊天消息的POST请求。
我正在学习android开发,所以我需要一些关于建立聊天信息上传架构的帮助。
目前执行情况
当需要发布新的聊天消息时,客户端执行以下操作
unique work来发布此消息。这是理想吗?我看到了一些问题。
更好的实施
仍然不理想
这些执行的问题是:
我们正在对工作人员进行变异,而不是将新任务附加到队列中。
- We can't use the one worker per message implementation because we loose chronology and there are too many workers这是一个分布式系统问题。
android-workmanager管理),他们应该活着回来。问题
发布于 2021-10-18 06:37:44
是的,您可以使用Service有效地同步消息,首先创建一个对象,该对象将从Live扩展,以获取网络更新的实时更新,
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)
}
})
}然后在应用程序类中像这样初始化它,
@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时,您可以检查是否有需要在线同步的消息。但请记住,只有当应用程序处于前台时,它才能工作。
https://stackoverflow.com/questions/69611355
复制相似问题