जब हम registerNetworkCallbackविधि का उपयोग करके नेटवर्क कॉलबैक पंजीकृत करते हैं तो कभी-कभी यह ट्रिगर नहीं होता है और कभी-कभी यह गलत-सकारात्मक ट्रिगर करता है:
- यदि हम इंटरनेट कनेक्शन के साथ एक ऐप शुरू करते हैं तो
onAvailableविधि ट्रिगर हो जाती है।
- लेकिन अगर डिवाइस पर कोई इंटरनेट कनेक्शन नहीं है, जब हम एक ऐप शुरू करते हैं तो कुछ भी नहीं
NetworkCallbackकहा जाता है (यह पी 1 के कारण बहुत अजीब है)
- अगर हमारे पास wifi कनेक्शन है लेकिन बिना इंटरनेट कनेक्शन के
onAvailableविधि चालू है। और मुझे लगता है कि यह गलत-सकारात्मक व्यवहार है क्योंकि हम इंटरनेट कनेक्शन देखने की उम्मीद करते हैं।
जैसा कि आप डिफ़ॉल्ट इंटरनेट कनेक्शन द्वारा नीचे दिए गए कोड में देखते हैं और यह तभी बदलता है जब यह बदलता है। कोई गलत-सकारात्मक ट्रिगर नहीं करता।
इसे और इस उत्तर को संक्षेप में दें (लेकिन केवल API> = 21 के लिए):
class ConnectionManager @Inject constructor(
private val connectivityManager: ConnectivityManager,
private val disposable: CompositeDisposable,
private val singleTransformer: SingleTransformer<*, *>
) : LiveData<Boolean>() {
private var isNetworkAvailable = true
private val builder = NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
private val callback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
ping()
}
override fun onLost(network: Network) {
ping()
}
}
private fun ping() {
disposable.add(
Single.fromCallable {
try {
val timeoutMs = 1500
val socket = Socket()
val socketAddress = InetSocketAddress("8.8.8.8", 53)
socket.connect(socketAddress, timeoutMs)
socket.close()
true
} catch (e: IOException) {
false
}
}
.compose(singleTransformer as SingleTransformer<Boolean, Boolean>)
.subscribeBy {
if (isNetworkAvailable != it){
value = it
isNetworkAvailable = it
}
}
)
}
override fun onActive() {
ping()
connectivityManager.registerNetworkCallback(builder.build(), callback)
}
override fun onInactive() {
disposable.clear()
connectivityManager.unregisterNetworkCallback(callback)
}
}
निर्भरता कैसे प्रदान करें
@Provides
fun provideTransformer(): SingleTransformer<Boolean, Boolean> {
return SingleTransformer<Boolean, Boolean> { upstream: Single<Boolean> ->
upstream.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
}
}
@Singleton
@Provides
fun provideConnectivityManager(context: Context): ConnectivityManager =
context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
@Singleton
@Provides
fun provideConnectionManager(connectivityManager: ConnectivityManager, singleTransformer: SingleTransformer<Boolean, Boolean>): ConnectionManager =
ConnectionManager(connectivityManager, singleTransformer)
और कैसे उपयोग करें:
@Inject
lateinit var connectionManager: ConnectionManager
//....
viewLifecycleOwner.observe(connectionManager) { isInternetAvailable ->
// TODO
}
targetSdkVersionएन या बाद में उत्थान की आवश्यकता होती है ?