gpt4 book ai didi

android - 如何在 okhttp3 的 dagger 2 模块中检查互联网连接

转载 作者:行者123 更新时间:2023-11-29 17:01:10 25 4
gpt4 key购买 nike

我正在使用 dagger 2 为 okhttp3 创建模块。现在我想检查网络模块内的互联网连接。实现这一目标的最佳方法是什么?

最佳答案

For those who are Following MVVM or Kotlin Coroutines(not necessary) and above api 22 here it is:

随着 Dagger AndroidMVVM 的新实现。
在深入研究之前,您的 Dagger 类图或对象图已经设置好,然后您必须执行以下操作:

ConnectivityInterceptor 接口(interface)

interface ConnectivityInterceptor : Interceptor


ConnectivityInterceptorImpl

您可以使用自定义异常类或简单地使用 IOException
要检查移动设备的互联网连接状态,您必须使用连接管理器,当然还要从 list 中启用网络状态
isOnline() 中,有些东西不适合api 28api 29,如果 api级别低于 22 所以我使用当前状态,如果你高于 api 22

也不会打扰你
class ConnectivityInterceptorImpl (
private var application: Application
) : ConnectivityInterceptor {

override fun intercept(chain: Interceptor.Chain): Response {
if (!isOnline())
throw NoConnectivityException() //custom Exception class
return chain.proceed(chain.request())
}

private fun isOnline(): Boolean {
val connectivityManager = application.getSystemService(
Context.CONNECTIVITY_SERVICE
) as ConnectivityManager
var res = false
connectivityManager.let {
it.getNetworkCapabilities(connectivityManager.activeNetwork)?.apply {
res = when {
hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true
hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true
else -> false
}
}
}
return res
}
}



Dagger 应用模块

Dagger 怪来了:
由于我们使用 Interceptor 来获取网络状态,这当然会在 okHttpClient 中充当拦截器,并且 Okkhttp 在这里用于进行 之后的网络调用retrofitBuilder() 这意味着我们正在做一些叫做 Singleton 的事情,所以在那种情况下我们必须管理 Dagger 的对象图

@Module
abstract class AppModule {

@Module
companion object {
@JvmStatic
@Singleton
@Provides
fun providesConnectivityInterceptorImpl(application: Application):
ConnectivityInterceptorImpl {
return ConnectivityInterceptorImpl(application)
}

@JvmStatic
@Singleton
@Provides
fun getClient(connectivityInterceptorImpl: ConnectivityInterceptorImpl): ApiService {
val requestInterceptor = Interceptor { chain ->
val url = chain.request()
.url()
.newBuilder()
.addQueryParameter("api", KEY)
.build()

val request =
chain
.request()
.newBuilder()
.url(url)
.build()
return@Interceptor chain.proceed(request)
}

val okHttpClient = OkHttpClient
.Builder()
.addInterceptor(connectivityInterceptorImpl) // here it is
.addInterceptor(requestInterceptor)
.connectTimeout(60, TimeUnit.SECONDS)
.build()

return Retrofit.Builder()
.client(okHttpClient)
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(ApiService::class.java)
}
}
}



枚举类

处理网络状态

enum class Status  {
RUNNING,
SUCCESS,
FAILED
}

class NetworkState(val status: Status, val msg: String) {
companion object {
val LOADED: NetworkState = NetworkState(Status.SUCCESS,"Success")
val LOADING: NetworkState = NetworkState(Status.RUNNING,"Running")
val ERROR: NetworkState = NetworkState(Status.FAILED,"Failed")
}
}



存储库

在存储库中执行此操作:
如果您正在使用 DataSource 层,则可以在 dataSource 类中执行此操作

private val _networkState = MutableLiveData<NetworkState>()
val returnNetworkState: LiveData<NetworkState>
get() = _networkState
fun networkData(){
CoroutineScope(IO).launch {
_networkState.postValue(NetworkState.LOADING)
try {
//Asynchronous Operation
_networkState.postValue(NetworkState.LOADED)

} catch (e: NoConnectivityException) { // custom exception class
Log.d(TAG, "No Internet Is Available")
_networkState.postValue(NetworkState.ERROR)

}
}
}



在您的 Activity/Fragment 中相应地通过 LiveData 更新您的 UI 观察。

myViewModel.returnNetworkState.observe(this, Observer {
//textView or anything
})


全部完成。

关于android - 如何在 okhttp3 的 dagger 2 模块中检查互联网连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42919621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com