Timer.sleep() 之前的 (View.INVISIBLE) 不起作用

Posted

技术标签:

【中文标题】Timer.sleep() 之前的 (View.INVISIBLE) 不起作用【英文标题】:(View.INVISIBLE) before Timer.sleep() not working 【发布时间】:2018-11-05 18:42:47 【问题描述】:

我有几个按钮我想暂时不可见,然后再让它们可见。 。我还没有弄清楚。有任何想法吗? 谢谢,史蒂夫

private void commonBtnHandler(Button btn) 
    try 
        btn.setVisibility(View.INVISIBLE);
        Thread.sleep(250);
        btn.setVisibility(View.VISIBLE);
     catch (Exception e) 
        e.printStackTrace();
    

【问题讨论】:

您如何确定View.INVISIBLE 不起作用?线程仅休眠 250 毫秒。它只是眨眼。 它不起作用,因为您阻塞了 UI 线程,这将使视图不可见。尝试使用Handler.postDelayed()btn.setVisibility(View.VISIBLE); 延迟250 毫秒 我认为这已经在Handler 中了。如果不是,那么您的评论是正确的。 . 【参考方案1】:

您不应该在 UI/主线程上执行 Thread.sleep()。这将导致 UI 冻结 & ANR

试试:

btn.setVisibility(View.INVISIBLE);
new Handler().postDelayed(new Runnable() 
    @Override
    public void run() 
        btn.setVisibility(View.VISIBLE);
    
, 250);

另外250 ms 是一个非常小的时间。

【讨论】:

【参考方案2】:
 btn.setVisibility(View.INVISIBLE);
     new Thread() 
     public void run() 
            try 
                runOnUiThread(new Runnable() 
                    @Override
                    public void run() 
                     btn.setVisibility(View.VISIBLE);
                    
                );
                Thread.sleep(250);
             catch (InterruptedException e) 
                e.printStackTrace();
            
    
.start();

当需要在运行时更改 UI 时,请始终放置 runOnUiThread,这对您有帮助。

【讨论】:

【参考方案3】:

感谢大家的意见。

我尝试了所有建议,延迟了 3000 毫秒,但仍然没有看到闪烁。

另外,我想知道我是否阻塞了 UI 线程。我以为 INVISIBLE 会在 sleep() 生效之前完成。

总结:我写了一个循环来调用 10 次。在所有情况下,延迟似乎都被忽略了。我感谢大家的帮助。看来我需要重新考虑这应该如何工作。我认为这与游戏程序员确保同步操作的方式没有太大不同。

【讨论】:

【参考方案4】:

以另一种方式解决此问题,我没有隐藏按钮,而是使用 setOnTouchListener 中的 MotionEvent 临时更改了颜色。按下按钮时会改变颜色,释放时会恢复到原始颜色。效果很好!

    mBtn.setOnTouchListener(new View.OnTouchListener() 
        @Override
        public boolean onTouch(View v, MotionEvent event) 
            switch ( event.getAction() ) 
                case MotionEvent.ACTION_DOWN:
                    mBtn.setBackgroundColor(getResources().getColor(R.color.colorLightOrange));
                    break;
                case MotionEvent.ACTION_UP:
                    mBtn.setBackgroundColor(getResources().getColor(R.color.colorOrange));
                    break;
            
            return true;
        
    );

【讨论】:

以上是关于Timer.sleep() 之前的 (View.INVISIBLE) 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Python - 准确的 time.sleep

键盘输入超时?

键盘输入超时?

安卓 dex 通用脱壳技术研究

C ++中的控制台程序[重复]

键盘输入在Python中超时