Как заставить InetAddress.reachable () выполняться быстрее? - PullRequest
0 голосов
/ 21 июня 2019

В моем приложении я пытаюсь получить список подключенного устройства к Wi-Fi здесь, я могу успешно получить все устройства, но проблема в том, что весь процесс занимает много времени, чтобы выполнить здесь, когда я удаляю val reachable = address.isReachable(1000) из моего цикла выполняется немедленно, но мне нужна эта строка кода для проверки соединения, поэтому мой вопрос заключается в том, как улучшить мой код, чтобы быстрее достичь желаемых результатов!

Любые предложения будут оценены!

Вот мой код:

for (i in 0..254)
                    {
                        val testIp = prefix + (i).toString()
                        val address = InetAddress.getByName(testIp)
                        val reachable = address.isReachable(1000)
                        val hostName = address.hostName.toString()
                        if (reachable) {
                            Log.i(TAG, "Host: " + (hostName) + "(" + (testIp) + ") is Connected!")
                        }

                    }

Это мой полный код для получения списка подключенных устройств:

fun sniffnetwork(){
        val mContextRef:WeakReference<Context>
        mContextRef = WeakReference<Context>(this)
        Observable.fromCallable {
            Log.d(TAG, "Let's sniff the network")
            try
            {
                val context = mContextRef.get()
                if (context != null)
                {
                    val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
                    val activeNetwork = cm.getActiveNetworkInfo()
                    val wm = context.getApplicationContext().getSystemService(Context.WIFI_SERVICE) as WifiManager
                    val connectionInfo = wm.getConnectionInfo()
                    val ipAddress = connectionInfo.getIpAddress()
                    val ipString = Formatter.formatIpAddress(ipAddress)
                    Log.d(TAG, "activeNetwork: " + activeNetwork.toString())
                    wifiname = activeNetwork.extraInfo
                    wifiname= wifiname.replace("^\"|\"$".toRegex(), "")
                    tvwifiname.text = wifiname + " "+ "connected "
                    Log.d(TAG, "ipString: " + (ipString).toString())
                    val prefix = ipString.substring(0, ipString.lastIndexOf(".") + 1)
                    Log.d(TAG, "prefix: " + prefix)
                    for (i in 0..254)
                    {
                        val testIp = prefix + (i).toString()
                        val address = InetAddress.getByName(testIp)
                        val reachable = address.isReachable(200)
                        val hostName = address.hostName.toString()
                        if (reachable) {
                            Log.i(TAG, "Host: " + (hostName) + "(" + (testIp) + ") is Connected!")
                        }

                    }
                }
                else
                {
                    Log.i("error:","Context is null")
                }
            }
            catch (t:Throwable) {
                Log.e(TAG, "Well that's not good.", t)
            }

        }.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe{

                }
    }
...