У меня есть класс для получения сообщения 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()
из-за его секрета, спасибо за вашу помощь