যখন আমরা registerNetworkCallbackপদ্ধতিটি ব্যবহার করে কোনও নেটওয়ার্ক কলব্যাক নিবন্ধভুক্ত করি তখন কখনও কখনও এটি ট্রিগার হয় না এবং কখনও কখনও এটি মিথ্যা-পজিটিভকে ট্রিগার করে:
- আমরা যদি ইন্টারনেট সংযোগ দিয়ে কোনও অ্যাপ্লিকেশন শুরু করি তবে
onAvailableপদ্ধতিটি ট্রিগার হয়ে যায়।
- কিন্তু যখন আমরা কোনও অ্যাপ্লিকেশন শুরু করি তখন ডিভাইসে কোনও ইন্টারনেট সংযোগ না থাকলে এর কিছুই
NetworkCallbackবলা হয় না (এটি পি। 1 এর কারণে খুব আশ্চর্যজনক)
- আমাদের যদি ওয়াইফাই সংযোগ থাকে তবে ইন্টারনেট সংযোগ
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 ->
}
targetSdkVersionজন্য এন বা তারপরে আপ করা দরকার ?