java - 来自 Handler 的安全 UI 更新
问题描述
我发现包含 UI 使用的示例代码不是来自Head First Android Development
书中的主线程。
根据我run(){}
在单独线程中运行的理解内容。并且 linedistanceView.setText(distanceStr);
正在尝试使用不允许来自主线程的 UI。我错了吗?
private void displayDistance()
{
final TextView distanceView = (TextView) findViewById(R.id.distance);
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run()
{
double distance = 0.0;
if (bound && odometer != null) {
distance = odometer.getDistance();
}
String distanceStr = String.format(Locale.getDefault(),"%1$,.2f miles", distance);
distanceView.setText(distanceStr);
handler.postDelayed(this, 1000);
}
});
}
解决方案
根据Handler() 文档:
默认构造函数将此处理程序与
Looper
当前线程相关联。
因此,只要displayDistance()
在主线程上被调用,Handler就会在运行任何Runnable
传递给它的线程时使用主线程。
推荐阅读
- mysql - 如何在 MySQL 中使用 avg() 函数求前 3 行的平均值
- python - Scipy-optimize.root_scalar 不一致地给出 f(a) 和 f(b) 必须有不同的符号
- python - 使用 Flask-Sqlalchemy 使用过滤器进行分页
- android - 颤振:无法构建android apk
- ember.js - FullCalendar Ember 支持
- c# - 如何通过将两个或多个字段与 mongoDb c# 驱动程序组合的某些表达式进行过滤/排序
- javascript - 如何在谷歌网站中使用具有多个页面的谷歌脚本网络应用程序?
- c++ - 如何将类成员注册为队列的回调函数?
- javascript - Jquery函数:获取img宽度和高度然后addClass不起作用
- java - java.lang.SecurityException:用户 11029 和当前进程都没有 android.permission.SET_TIME_ZONE