【问题标题】:Android - Proper way to listen for variable change, and do something upon change?Android - 监听变量变化并在变化时做些什么的正确方法?
【发布时间】:2013-06-08 14:30:03
【问题描述】:

我正在制作的应用程序需要在特定变量的值从 0 变为 1 时执行一些代码。
下面的处理程序示例是我目前用来执行此操作的方法(我从其他人那里复制了它)。
我觉得这不是一个合适的方法,因为在我的应用程序中只有三个这样的处理程序会导致 UI 相当无响应,并导致设备(电话)变得非常热。
如您所见,我在处理程序中设置了 10 毫秒的延迟来尝试处理此问题。
难道没有更类似于 OnClickListener 的东西,它可以随时监听变量值的变化,而不会给 CPU 带来如此大的压力吗?
我对 Java 和 Android 还很陌生,所以非常感谢一个简单的例子。

  final Handler myHandler1 = new Handler();
  new Thread(new Runnable()
  {
  @Override
     public void run()
     {
        while (true)
        {
           try
           {
           Thread.sleep(10);
           myHandler1.post(new Runnable()
              {
              @Override
                 public void run() 
                 {
                    if (myVariable == 1)
                    {
                    myVariable = 0;
                    //do stuff
                    }   
                 }
              });
           } catch (Exception e) {}
        }
     }  
  }).start();

【问题讨论】:

  • 如果需要,您可以实现您的委托模式。你有什么问题
  • 是什么改变了变量的值,它多久发生一次?看来您需要BroadcastReceiver
  • @Squonk 按下键盘上的回车键或屏幕上的按钮会将值更改为 1。频率取决于用户按下键/按钮的频率。最有可能的是,值更改最多每秒发生一次,但重要的是要识别值更改并立即采取行动,这样用户就不会看到延迟响应。
  • @EricGlass :在那种情况下,我真的不明白你的问题是什么。为什么不只做需要在键/按钮事件处理程序中完成的事情?
  • @Squonk 在这种特殊情况下,我试图让事情保持整洁,并试图通过同时按下回车键和同时按下屏幕按钮。但这主要只是给你一个例子。我最近遇到了几种情况,在这些情况下,能够“倾听”变量是最理想的。目前,除了尝试解决特定问题之外,我只是在寻找我提出的问题的答案,以供知识和将来参考。

标签: android variables handler listen


【解决方案1】:

您必须通过 setter 方法设置变量。然后,您可以对这种变化做出反应。

public void setMyVariable(int value) {
this.myVariable = value;
if (myVariable == 1) {
  doSomethingWhen1();
} else if (myVariable == 0) {
  doSomethingWhen0();
}
}

观察者模式是一种更优雅的方法,Here 您可以找到有关它的更详细文档。

您一定要避免在移动设备上出现while(true) 循环,它会耗尽您的电池并且您还会阻塞 UI 线程。这就是为什么您的 UI 没有响应并且您的手机很烫的原因。

【讨论】:

  • 我无法让它工作。该应用程序的行为就好像我什至从未插入它一样:( ...我是留下“价值”这个词还是用其他东西代替它?
  • 我想我明白了。我应该使用这个:setMyVariable(1);打电话给这件事。与我需要的完全不同,但至少现在我知道如何调用某些东西。感谢您提供有关 while(true) 的信息……很高兴知道。
猜你喜欢
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多