Проверьте интернет-соединение Android в Kotlin - PullRequest
0 голосов
/ 02 июля 2018

Я попробовал ответ от этого (принятый ответ). Я могу использовать метод «PING», но пользовательский интерфейс стал черным, поскольку он говорит, что заблокирует поток пользовательского интерфейса. Это выглядело не очень хорошо и вызывало беспокойство, поэтому я попытался использовать второй метод «Подключение к сокету в Интернете», но я не знаю, как использовать этот класс в Котлине.

Это результат конвертации Java в kotlin на android studio

package com.mockie.daikokuten.helpers

import android.os.AsyncTask.execute
import android.os.AsyncTask
import java.io.IOException
import java.net.InetSocketAddress
import java.net.Socket


internal class InternetCheck(private val mConsumer: Consumer) : AsyncTask<Void, Void, Boolean>() {
interface Consumer {
    fun accept(internet: Boolean?)
}

init {
    execute()
}

override fun doInBackground(vararg voids: Void): Boolean? {
    try {
        val sock = Socket()
        sock.connect(InetSocketAddress("8.8.8.8", 53), 1500)
        sock.close()
        return true
    } catch (e: IOException) {
        return false
    }

}

override fun onPostExecute(internet: Boolean?) {
    mConsumer.accept(internet)
}
}

но Я НЕ ЗНАЮ, КАК ЕГО ИСПОЛЬЗОВАТЬ . Я пробовал так:

InternetCheck{ internet-> Log.d("test", "asdasdas") }

Это не работает и приводит к ошибке. Это говорит, что я должен пройти «Потребитель».

Мой вопрос Как использовать этот класс ?

Ответы [ 7 ]

0 голосов
/ 10 января 2019

Самая короткая версия

val Context.isConnected: Boolean
    get() {
        return (getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager)
           .activeNetworkInfo?.isConnected == true
    }
0 голосов
/ 28 июля 2019

Проверка подключения в Android

Котлин :

fun isOnline(context: Context): Boolean {
    val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    val networkInfo = connectivityManager.activeNetworkInfo
    return networkInfo != null && networkInfo.isConnected
}

Java

public static boolean isOnline(Context context) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
    return networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected();
}

оба метода требуют разрешения:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET"/>
0 голосов
/ 16 октября 2018

Я изменил ваш класс на этот

internal class InternetCheck(private val onInternetChecked: (Boolean) -> Unit) : 
AsyncTask<Void, Void, Boolean>() {
 init {
     execute()
 }

 override fun doInBackground(vararg voids: Void): Boolean {
     return try {
         val sock = Socket()
         sock.connect(InetSocketAddress("8.8.8.8", 53), 1500)
         sock.close()
         true
     } catch (e: IOException) {
         false
     }

 }

 override fun onPostExecute(internet: Boolean) {
     onInternetChecked(internet)
 }
}

Таким образом, вы можете использовать лямбда-функцию, и вам также не придется иметь дело с проверкой нуля там:

InternetCheck{ internet-> Log.d("Connection", "Is connection enabled? "+internet) }
0 голосов
/ 02 июля 2018
 fun verifyAvailableNetwork(activity:AppCompatActivity):Boolean{
      val connectivityManager=activity.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
      val networkInfo=connectivityManager.activeNetworkInfo
      return  networkInfo!=null && networkInfo.isConnected
}
0 голосов
/ 02 июля 2018

Вы можете использовать это так:

   InternetCheck(object : InternetCheck.Consumer {
      override fun accept(internet: Boolean?) {
         Log.d("test", "asdasdas")
      }
   })

Для получения дополнительной информации вы можете увидеть эту тему: https://youtrack.jetbrains.com/issue/KT-7770

0 голосов
/ 02 июля 2018

Назовите AsyncTask таким образом, он должен работать. Вам не нужно ничего менять в своей интернет-проверке AsyncTask. По сути, вам нужно передать объект, который реализует интерфейс Consumer, определенный в классе InternetCheck.

InternetCheck(object : InternetCheck.Consumer {
    override fun accept(internet: Boolean?) {
        Log.d("test", "asdasdas")
    }
})
0 голосов
/ 02 июля 2018

Попробуйте этот служебный метод, чтобы проверить наличие Интернета.

fun isNetworkAvailable(context: Context): Boolean {
        val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        var activeNetworkInfo: NetworkInfo? = null
        activeNetworkInfo = cm.activeNetworkInfo
        return activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting
    }

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...