能否在Navigation类调用MapActivity的TextView.setText()?是否需用runOnUIThread?
问题解答
首先纠正代码里的一个明显错误:你的MapActivity中定义的TextView变量是mDistance,但Navigation类的updateText方法里调用的是mapActivity.mTravelTime.setText(text),这会触发找不到变量的编译错误,必须先把变量名改为mapActivity.mDistance.setText(text)才能继续。
接下来回答线程相关的问题:
- 如果
updateText方法是在UI线程中被调用的(比如在MapActivity的onCreate、点击事件回调等UI线程执行的代码里调用navi.updateText),那么直接调用mapActivity.mDistance.setText(text)是完全可行的,不需要使用runOnUIThread——因为UI组件的更新操作本身就要求在UI线程执行,此时当前线程就是UI线程,符合要求。 - 如果
updateText方法是在子线程中被调用的(比如Navigation类里执行了网络请求、定位监听等耗时操作,在子线程的回调里触发updateText),那么直接调用setText会抛出CalledFromWrongThreadException异常,这时候必须通过runOnUIThread切换到UI线程执行更新,也可以用mapActivity.mDistance.post(() -> mapActivity.mDistance.setText(text))这类方式实现。
另外需要注意:Navigation类直接持有MapActivity的强引用,容易引发内存泄漏(比如Navigation的生命周期比MapActivity长时,Activity实例无法被GC回收),建议改用接口回调的方式传递更新通知,或者用WeakReference<MapActivity>来持有Activity实例,降低内存泄漏风险。
内容的提问来源于stack exchange,提问作者user1618809
相关产品推荐
相关产品推荐

