代码之家  ›  专栏  ›  技术社区  ›  Kakashi

检查Kotlin的Android网络连接

  •  6
  • Kakashi  · 技术社区  · 8 年前

    我试过的答案来自 this (公认的答案)。我可以使用“ping”方法,但是UI变黑了,因为它说会阻塞UI线程。它看起来不太好,令人不安,所以我尝试使用第二种方法“连接到互联网上的插座”,但我不知道如何使用Kotlin中的类。

    这是Android工作室将Java转换为KOTLIN的结果。

    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") }
    

    它不起作用,导致错误。它说我必须通过“消费者”。

    我的问题是 如何使用该类 ?

    6 回复  |  直到 7 年前
        1
  •  5
  •   Vishnu M.    8 年前

    以这种方式调用AsyncTask,它应该可以工作。您不需要更改InternetCheck异步任务中的任何内容。基本上,您需要传入一个实现InternetCheck类中定义的使用者接口的对象。

    InternetCheck(object : InternetCheck.Consumer {
        override fun accept(internet: Boolean?) {
            Log.d("test", "asdasdas")
        }
    })
    
        2
  •  9
  •   IramML    8 年前
     fun verifyAvailableNetwork(activity:AppCompatActivity):Boolean{
          val connectivityManager=activity.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
          val networkInfo=connectivityManager.activeNetworkInfo
          return  networkInfo!=null && networkInfo.isConnected
    }
    
        3
  •  1
  •   Renan Arceno    8 年前

    您可以这样使用它:

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

    有关更多信息,您可以看到此线程: https://youtrack.jetbrains.com/issue/KT-7770

        4
  •  1
  •   Radim Janda    7 年前

    我把你的课改成了这个

    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)
     }
    }
    

    因此,您可以使用lambda函数,也不必在这里处理空签入:

    InternetCheck{ internet-> Log.d("Connection", "Is connection enabled? "+internet) }
    
        5
  •  1
  •   Vlad    7 年前

    最短版本

    val Context.isConnected: Boolean
        get() {
            return (getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager)
               .activeNetworkInfo?.isConnected == true
        }
    
        6
  •  0
  •   Naveen T P    8 年前

    尝试此实用程序方法检查Internet的可用性。

    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
        }
    

    希望这有帮助。