如何刷新android视图?

时间:2015-06-09 07:50:08

标签: android android-handler

我正在编写一个应用程序,我的一个视图需要不断地使用定时器闪烁,但我很难让它眨眼。

这是我的处理程序代码

@SuppressWarnings("All")
private Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        try {
            circle.setVisibility(View.VISIBLE);
            Thread.sleep(100);
            circle.setVisibility(View.INVISIBLE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};

所以我经常向一些INTERVAL的处理程序发送一条空消息,我希望图像在100毫秒内可见,然后再次隐藏。但问题是,在方法完成之前,我的UI元素将不会刷新。我是怎么做到的?

提前致谢。

4 个答案:

答案 0 :(得分:1)

Thread t = new Thread() {
    @Override
    public void run() {
        try {
            while (!isInterrupted()) {
                Thread.sleep(1000);
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        if(circle.isVisible()){circle.setVisibility(View.VISIBLE);}
                        else{
                            circle.setVisibility(View.INVISIBLE);
                        }
                    }
                });
            }
        } catch (InterruptedException e) {
        }
    }
};
t.start();

答案 1 :(得分:0)

private Handler mHandler = new Handler() {
    public void handleMessage(Message msg) {
        if(msg.what == 1) circle.setVisibility(View.VISIBLE);
        if(msg.what == 2) circle.setVisibility(View.INVISIBLE);
    }
};

然后发送消息1& 2某处。

答案 2 :(得分:0)

这是一个runnable的例子,它可以切换可见性并无限地重新发布自己,每100毫秒延迟一次。您遇到的问题是您正在停止主UI线程,所以没有其他任何事情会发生,您的程序可能正在冻结吗?无论如何,这是一种解决方案。另一个可能是在另一个帖子中发帖。

    final Handler mHandler = new Handler();
    final View circle = ....;

    Runnable blink = new Runnable() {

        @Override
        public void run() {

            int vis = circle.getVisibility();

            if(vis == View.VISIBLE){
                circle.setVisibility(View.INVISIBLE);
            }else{
                circle.setVisibility(View.VISIBLE);
            }

            mHandler.postDelayed(this, 100);
        }
    };

    mHandler.post(blink);

答案 3 :(得分:0)

上述解决方案(HandlerThread ...)的替代方法是创建Animator并依赖于Androids灵活的动画功能。
在此代码段中,您可以直接在View的visibility-property上制作动画,而您需要定义自定义TimeInterpolator(仅返回两个不同的值0.0和1.0),如下所示:

    final ObjectAnimator anim = ObjectAnimator.ofInt(circle, "visibility",
            View.VISIBLE, View.INVISIBLE);
    anim.setRepeatMode(Animation.REVERSE);
    anim.setRepeatCount(Animation.INFINITE);
    anim.setDuration(1000);
    anim.setInterpolator(new TimeInterpolator() {
        @Override
        public float getInterpolation(float input) {
            return Math.round(input);
        }
    });
    anim.start();