Как сделать задержку сообщения NMEA ANDROID - PullRequest
0 голосов
/ 09 марта 2020

У меня есть класс для получения сообщения NMEA, и мне нужно задержать мое сообщение на 5 секунд, как мы можем сделать задержку? Класс такой:

@RequiresApi(Build.VERSION_CODES.N)
class NmeaActivity : AppCompatActivity(), LocationListener, OnNmeaMessageListener {
    val PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION_ID = 0x10
    lateinit var locationManager : LocationManager
    var datanmea = ""
    lateinit var term : TextView
    lateinit var stop : Button
    lateinit var clear : Button

    var paused = false
    var apikey = ""
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_nmea)
    term = findViewById(R.id.nmeaText)
    stop = findViewById(R.id.buttonstop)
    clear = findViewById(R.id.buttonclear)
    this.initGPSgettingLogic()
    clear.setOnClickListener{
        term.text = null
    }
    stop.setOnClickListener{
        val bool: Boolean = !this.paused
        this.paused = bool
    }

}

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    when (requestCode) {
        PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION_ID -> {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.isNotEmpty()
                && grantResults[0] == PackageManager.PERMISSION_GRANTED
            ) { // granted
                this.initGPSgettingLogic()
            } else { // denied,
            }
            return
        }
    }
}

private fun initGPSgettingLogic() {
    this.locationManager =
        this.getSystemService(Context.LOCATION_SERVICE) as LocationManager
    if (paused){
        startListen()
    }else{
        stopListen()
    }
}

override fun onLocationChanged(location: Location?) {

}
override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {

}

override fun onProviderEnabled(provider: String?) {

}

override fun onProviderDisabled(provider: String?) {

}

private fun startListen(){
    val gpsEnabled: Boolean = locationManager.isProviderEnabled(
        LocationManager.GPS_PROVIDER
    )
    if (gpsEnabled) { //GPS ON
        Log.d("NMEA_APP", javaClass.name + ":" + "GPS ON :)")
        if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // Permission is not granted
            Log.d("NMEA_APP", javaClass.name + ":" + "Request Permission ")
            // No explanation needed; request the permission
            ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION_ID)
        }
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 10000f, this)
        locationManager.addNmeaListener(this)
    } else { //GPS NOT ON
        Log.d("NMEA_APP", javaClass.name + ":" + "GPS NOT ON")
    }
}

private fun stopListen(){
    locationManager.removeNmeaListener(this)
    locationManager.removeUpdates(this)
}

override fun onNmeaMessage(nmea: String?, timestamp: Long) {
    val mainHandler = Handler(Looper.getMainLooper())

    mainHandler.post(object : Runnable {
        override fun run() {
            mainHandler.postDelayed(this, 7000)
        }
    })
    Log.d(
        "NMEA_APP",
        javaClass.name + ":" + "[" + timestamp + "]" + nmea + ""
    )
    sendData(nmea)
}

private fun sendData(nmea: String?) {
    var data = nmea?.substringBefore(",")
    var title = data?.substringAfter("$")
    var gen = title?.substring(2,5)
    if(gen == "GGA"){
        datanmea = ""
        datanmea += "$nmea\r\n"
    }
    if(gen == "GSA" || gen == "RMC"){
        datanmea += "$nmea\r\n"
    }
    if(gen == "RMC"){
        Timer().schedule(timerTask {
            if(!paused) {
                correctionMap(datanmea)
            }
        }, 5000)
    }
}

Я создал метод sendData() для получения сообщения NMEA, и когда мы встретим сообщение ** RM C, мы отправим сообщение по методу correctionMap() после задержки в течение 5 секунд, я сделал это и его работу, но в первый раз запускаю, а затем через 5 секунд он не задерживается и не запускается каждую 1 секунду, возможно, у кого-то есть идея, что мне нужна ваша помощь

sry Я не могу объяснить метод correctionMap() из-за его секрета, спасибо за вашу помощь

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