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默认参数这个知识点哦…