Android Kotlin Ping工具

该博客介绍了一个使用Kotlin协程实现的网络ping功能,允许设置ping次数、超时时间、IP地址和是否需要ping过程中的消息。通过CoroutineScope管理和取消协程,提供了一个简单的API用于检查网络连接状态并获取ping的结果消息。此外,还提供了在应用销毁时关闭协程的方法。
摘要由CSDN通过智能技术生成
import android.util.Log
import kotlinx.coroutines.*
import java.io.BufferedReader
import java.io.InputStreamReader

/**
 * Created by Android Studio.
 * User: GGY
 * Date: 2021/4/24
 */
object NetworkPing {

    private val job = Job()

    val scope = CoroutineScope(job)

    private val TAG = "PING-SJSX:"

    /**
     * @param count ping这个ip几次 默认1次
     * @param outTime ping完之后多久超时 默认3秒
     * @param ip 默认ping百度的地址
     * @param needPingMesssage 是否需要ping的过程中的消息
     * @param pingMessage 返回需要ping的消息 如果想要消息则首先打开 [needPingMesssage]
     * @param pingSuccess 返回ping的状态
     */
    fun ping(
        count: Int = 1,
        outTime: Int = 3,
        ip: String = "www.baidu.com",
        whileTime: Long = 1500,
        needPingMesssage: Boolean = false,
        pingMessage: (String) -> Unit = { _ -> },
        pingSuccess: (Boolean) -> Unit) {
        scope.launch {
            val command = "ping -c $count -W $outTime $ip"
            while (true) {
                // 每[whileTime]s去 ping一次地址
                delay(whileTime)
                val proc = Runtime.getRuntime().exec(command)
                val reader = BufferedReader(InputStreamReader(proc.inputStream))
                when (proc.waitFor()) {
                    0 -> {
                        // 等价 pingSuccess(true)
                        pingSuccess.invoke(true)
                        if (needPingMesssage) {
                            val result = StringBuilder()
                            while (true) {
                                val line = reader.readLine() ?: break
                                result.append(line).append("\n")
                            }
                            Log.d(TAG, result.toString())
                            pingMessage(result.toString())
                        }
                    }
                    else -> {
                        // 只要是没有ping通,肯定是有原因
                        // 网络权限,ip地址,命令有误 等
                        pingSuccess.invoke(false)
                    }
                }
            }

        }
    }

    // 关闭当前的协程
    fun pingCancle() {
        scope.cancel()
    }
}

使用很简单,如果你只是需要返回一个连接是否成功的状态这样写就可以,其他参数都是默认的

// 这里返回值是在子线程哦,要是修改视图的话,记得切换回主线程
NetworkPing.ping {
    Log.i("guo", "connect success :$it")
}

如果你还需要ping过程的消息体

NetworkPing.ping(needPingMesssage = true,
  pingMessage = { message ->
    Log.i("guo", "ping message :$message")
  },
  pingSuccess = {
    Log.i("guo", "connect success :$it")
 })

不需要的话记得关闭掉

 override fun onDestroy() {
   NetworkPing.pingCancle()
 }

如果其他参数不会设置的话,建议您去学习一下kotlin默认参数这个知识点哦…

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值