如何从片段中以位置精度不断更新textview

时间:2019-04-04 02:04:09

标签: android android-fragments location handler ui-thread

我想每2秒更新一次用户的定位准确性。

我已经创建了此函数free (example_node->left); free (example_node->right); free (example_node); ,该函数在每次调用textView时都会使用当前位置对其进行更新。

我希望每2秒调用一次。这是我当前的代码,但是不起作用-文本即使一次也没有得到值,并保持空白,如果我使用没有runOnUiThread的函数,它将至少显示一次。

getAccuracy(activity, currentAccuracy)

这是使用AirLocation库的函数

    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)

1 个答案:

答案 0 :(得分:1)

您每2秒重新创建一次AirLocation实例,这不好,因为它可能甚至没有足够的时间来获取位置数据。您应该使用相同的实例。要解决此问题...

您应将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的{​​{1}}

onActivityResult

如果您正在处理必需的权限并且位置设置已启用,则该方法应该可以工作。 不幸的是,该库不允许您设置位置请求之间的间隔,该间隔设置为10秒,最快间隔为2秒,您无法更改。这是源代码的片段...

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

但是,如果控制间隔对您至关重要,则可以构建自己的实现。没那么难。祝你好运