首页 > 解决方案 > 来自 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);
            }
        });
    }

标签: javaandroid

解决方案


根据Handler() 文档

默认构造函数将此处理程序与Looper当前线程相关联。

因此,只要displayDistance()在主线程上被调用,Handler就会在运行任何Runnable传递给它的线程时使用主线程。


推荐阅读