Как постоянно обновлять textview с точностью до местоположения из фрагмента - PullRequest
0 голосов
/ 04 апреля 2019

Я хотел бы обновлять точность определения местоположения пользователей каждые 2 секунды.

Я создал эту функцию getAccuracy(activity, currentAccuracy), которая обновляет textView с текущим местоположением при каждом вызове.

Я бы хотел, чтобы он вызывался каждые 2 секунды.Это мой текущий код, но он не работает - текст не получает значения ни разу и остается пустым, где, если я использую функцию без runOnUiThread, он будет показан хотя бы один раз.

    val activity = activity as CameraActivity


    val handler = Handler()
    val delay: Long = 2000 //milliseconds

    handler.postDelayed(object : Runnable {
        override fun run() {

            activity.runOnUiThread {
                object : Runnable {
                    override fun run() {
                        getAccuracy(activity, currentAccuracy)
                    }
                }
            }

            handler.postDelayed(this, delay)
        }
    }, delay)

Эта функция использует библиотеку AirLocation

fun getAccuracy(activity: Activity, currentAccuracy: TextView) {

    airLocation = AirLocation(activity, true, true, object : AirLocation.Callbacks {
        override fun onSuccess(location: Location) {
            currentAccuracy.text = location.accuracy.toString()
            Log.d("locationAccuracy","Success")
        }

        override fun onFailed(locationFailedEnum: AirLocation.LocationFailedEnum) {
            Log.d("locationAccuracy","Fail")

        }

    })

}

1 Ответ

1 голос
/ 04 апреля 2019

Вы воссоздаете экземпляр AirLocation каждые 2 секунды, что нехорошо, потому что, вероятно, у него не будет достаточно времени, чтобы даже получить данные о местоположении.Вы должны использовать тот же экземпляр.Чтобы решить эту проблему ...

Вы должны сделать переменную airLocation закрытой переменной-членом класса.Я думаю, что вы уже сделали это ...

class YourActivity : AppCompatActivity() {

    private var airLocation: AirLocation? = null
}

Затем инициализируйте эту переменную в onCreate

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)

        airLocation = AirLocation(this, true, true, object: AirLocation.Callbacks {
                override fun onSuccess(location: Location) {
                    if(location != null){
                        currentAccuracy.text = location.accuracy.toString()
                    }
                }

                override fun onFailed(locationFailedEnum: AirLocation.LocationFailedEnum) {
                }

            })
}

Затем переопределите onActivityResult и вызовите AirLocation 's onActivityResult

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        airLocation?.onActivityResult(requestCode, resultCode, data)
        super.onActivityResult(requestCode, resultCode, data)
    }

Это должно работать, если вы обрабатываете необходимые разрешения и настройки местоположения включены.К сожалению, эта библиотека не позволяет вам установить интервал между запросами местоположения, интервал установлен в 10 секунд с самым быстрым интервалом в 2 секунды, вы не можете изменить это.Вот фрагмент исходного кода ...

val locationRequest = LocationRequest().apply {
        interval = 10000
        fastestInterval = 2000
        priority = LocationRequest.PRIORITY_HIGH_ACCURACY
        numUpdates = 1
    }

Однако, если вам важно контролировать интервалы, вы можете создать свою собственную реализацию.Это не так сложно.Удачи

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