【问题标题】:Thread sleep, does not do线程休眠,不做
【发布时间】:2013-09-11 14:53:58
【问题描述】:

我对 Java 中的 Thread 有疑问。我想在单击按钮(bt1)时将背景设置为图片,然后等待5秒并将同一按钮的背景设置为图片。问题是第一张图片从未设置过。程序只需等待 5 秒并设置图片 2。这是代码。

bt1.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {
          bt1.setBackgroundResource(R.drawable.picture);
              try
                 {
                   Thread.sleep(5000);
              }
              catch( InterruptedException e )
              {
                  e.printStackTrace();
              }
          bt1.setBackgroundResource(R.drawable.pic);
        }
    });

}

【问题讨论】:

  • 在我见过的几乎所有 UI 框架中,休眠在 UI 线程中都是一个坏主意。我怀疑你想要一个计时器。
  • 听起来你正在暂停前台 UI 线程。你必须派生一个后台线程来改变它。
  • 因为你设置了图片,然后休眠了UI线程,所以不能更新。唤醒它后,它会立即对其进行更改和更新。正如其他人所说,计时器,异步任务,可运行,除了睡眠之外的任何东西。 (无论如何,99% 的时间都在睡觉,这不是 1% 的人之一:)
  • 睡在几乎在任何地方通常是个坏主意。例如,设置一个计时器比将一个线程的资源占用 5 秒更好,即使它只是一个后台线程。

标签: java android multithreading sleep


【解决方案1】:

永远不要让用户界面线程休眠!

【讨论】:

  • @Gray:当然,它会让操作系统认为进程没有响应。
  • 注意扩展您的答案,以便为用户提供更多信息。现在是评论。请参阅@Patricia 的回答。
  • @Gray:我支持你 - 可以随意投反对票 - 但这里的问题非常严重,需要从头开始重新考虑,并给出一个非常大胆的答案。
  • 回答这些问题的目的是为后代提供信息。您想向显然是初级程序员解释他们缺少的概念。为什么不应该让用户界面线程休眠?这是什么意思?正确的做法是什么?
  • @Gray:也许我们应该进入聊天,但是,不要试图高高在上,我希望程序员永远不要再让 UI 线程休眠。我不希望这个答案被接受,但我相信它的合法性。
【解决方案2】:

问题是您在处理对 GUI 事件做出反应的线程中处于休眠状态。当该线程休眠时,GUI 已死。您需要做一些其他事情来获得 5 秒的延迟,例如使用 Timer 在 5 秒内创建一个新事件。

【讨论】:

    【解决方案3】:

    试试这个:

    public void onClick(View v) {
        bt1.setBackgroundResource(R.drawable.picture); 
        new Handler().postDelayed(new Runnable() {
    
                @Override
                public void run() {
                    bt1.setBackgroundResource(R.drawable.picture);
    
                }
            }, 5000);
    }
    

    【讨论】:

    • +1 用于使用更好的工具完成工作,而不是滥用sleep。 -1 表示没有解释的代码转储。
    【解决方案4】:

    这是因为您在主 UI 线程上运行所有内容。切勿对 UI 线程使用 sleep。

    这是给你的代码。

    public void onClick(View v) {
                bt1.setBackgroundResource(R.drawable.picture);
                Thread thread = new Thread()
                {
                    @Override
                    public void run() {
                        try {
                                Thread.sleep(5000);
                                runOnUiThread(new Runnable(){public void run()
                                {
                                    bt1.setBackgroundResource(R.drawable.pic);
                                }});    
    
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                };
    
                thread.start();
    
    
            }
        });
    

    【讨论】:

      【解决方案5】:

      使用倒计时

      new CountDownTimer(5000, 1000) {
      
       public void onTick(long millisUntilFinished) {
      
       }
      
       public void onFinish() {
            bt1.setBackgroundResource(R.drawable.picture);
      
       }
      }.start();
      

      【讨论】:

        【解决方案6】:

        使用Handlder.PostDelayed(),千万不要在UI Thread中做sleep、network、datebase等耗时的操作……

        【讨论】:

          【解决方案7】:

          为什么不使用调度器?这是一个可能的实现

          bt1.setOnClickListener(new View.OnClickListener() {
          
          @Override
          
          public void onClick(View v) {
                bt1.setBackgroundResource(R.drawable.picture);
                   ScheduledExecutorService scheduler = Executors
                      .newSingleThreadScheduledExecutor();
              scheduler.scheduleAtFixedRate(new Runnable() {
                  public void run() {
                       bt1.setBackgroundResource(R.drawable.pic);
                  }
              }, 5, 60, TimeUnit.SECONDS);
                bt1.setBackgroundResource(R.drawable.pic);
              }
          });
          

          }

          【讨论】:

          • 谢谢大家的回答。它真的帮了我很多。现在它可以按我的意愿工作了。
          猜你喜欢
          • 1970-01-01
          • 2011-09-18
          • 1970-01-01
          • 2020-05-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-24
          • 2011-06-01
          相关资源
          最近更新 更多