从Handler安全更新UI

时间:2019-04-21 18:25:12

标签: java android

我在Head First Android Development书中找到了包含不是来自主线程的UI使用情况的示例代码。

根据我的理解,run(){}的内容在单独的线程中运行。第distanceView.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);
            }
        });
    }

1 个答案:

答案 0 :(得分:3)

按照Handler() documentation

  

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

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