Android 安卓——倾听变量变化,并在变化时采取行动的正确方式?

Android 安卓——倾听变量变化,并在变化时采取行动的正确方式?,android,variables,handler,listen,Android,Variables,Handler,Listen,我正在制作的应用程序要求在某个特定变量的值从0变为1时执行一段代码。 下面的处理程序示例是我当前用于执行此操作的方法(我是从其他人那里复制的)。 但我觉得这不是一个合适的方法,因为在我的应用程序中只有三个这样的处理程序会导致用户界面没有响应,并导致设备(手机)变得非常热。 如您所见,我在处理程序中设置了10毫秒的延迟,以尝试处理此问题。 难道没有更像OnClickListener的东西可以随时监听变量值的变化,而不会对CPU造成如此大的压力吗? 我对Java和Android非常陌生,因此非常希望

我正在制作的应用程序要求在某个特定变量的值从0变为1时执行一段代码。
下面的处理程序示例是我当前用于执行此操作的方法(我是从其他人那里复制的)。
但我觉得这不是一个合适的方法,因为在我的应用程序中只有三个这样的处理程序会导致用户界面没有响应,并导致设备(手机)变得非常热。
如您所见,我在处理程序中设置了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();

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

public void setMyVariable(int value) {
this.myVariable = value;
if (myVariable == 1) {
  doSomethingWhen1();
} else if (myVariable == 0) {
  doSomethingWhen0();
}
}
一种更优雅的方法是观察者模式,您可以找到关于它的更详细的文档


当然,您必须避免在移动设备上执行
循环(true)
操作,这会耗尽您的电池电量,并且还会阻塞UI线程。这就是为什么你的用户界面没有响应,你的手机很热的原因。

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

public void setMyVariable(int value) {
this.myVariable = value;
if (myVariable == 1) {
  doSomethingWhen1();
} else if (myVariable == 0) {
  doSomethingWhen0();
}
}
一种更优雅的方法是观察者模式,您可以找到关于它的更详细的文档


当然,您必须避免在移动设备上执行
循环(true)
操作,这会耗尽您的电池电量,并且还会阻塞UI线程。这就是为什么你的UI没有响应,而你的手机很热的原因。

如果需要,你可以实现你的委托模式。你的问题是什么?变量的值发生了什么变化?变化的频率是多少?似乎您需要一个
BroadcastReceiver
@Squonk,按键盘上的enter键或屏幕上的按钮将值更改为1。频率由用户按下键/按钮的频率决定。最有可能的情况是,值更改最多每秒发生一次,但重要的是,必须立即识别并执行值更改,以便用户不会看到延迟响应。@EricGlass:在这种情况下,我不知道您的问题是什么。为什么不在按键/按钮事件处理程序中执行需要执行的操作?@Squonk在这种特殊情况下,我试图保持事情的整洁,并试图通过同时按下enter键和屏幕按钮来帮助确保流程的两个实例不能同时启动。但这对你来说只是一个例子。我最近遇到过几种情况,在这种情况下,能够“倾听”变量是理想的。目前,我不仅仅是在试图解决一个特定的问题,我只是在寻找我所问问题的答案,以供了解和将来参考。如果需要,您可以实现您的委托模式。你的问题是什么?变量的值发生了什么变化?变化的频率是多少?似乎您需要一个
BroadcastReceiver
@Squonk,按键盘上的enter键或屏幕上的按钮将值更改为1。频率由用户按下键/按钮的频率决定。最有可能的情况是,值更改最多每秒发生一次,但重要的是,必须立即识别并执行值更改,以便用户不会看到延迟响应。@EricGlass:在这种情况下,我不知道您的问题是什么。为什么不在按键/按钮事件处理程序中执行需要执行的操作?@Squonk在这种特殊情况下,我试图保持事情的整洁,并试图通过同时按下enter键和屏幕按钮来帮助确保流程的两个实例不能同时启动。但这对你来说只是一个例子。我最近遇到过几种情况,在这种情况下,能够“倾听”变量是理想的。目前,我不仅仅是在试图解决一个特定的问题,我只是在寻找我所问的问题的答案,为了知识和未来的参考。我无法让这个方法发挥作用。该应用程序的行为就好像我从未插入过它一样:(…我是留下“value”这个词还是用什么东西替换它?我想我已经找到了。我应该用这个:setMyVariable(1);来调用这个东西。与我需要的很不一样,但至少现在我知道如何调用某个东西了。谢谢你提供的有关while的信息(true)…很高兴知道。我无法让它工作。该应用程序的行为就像我从未插入过它一样:(…我是保留“value”这个词还是用其他词替换它?我想我已经找到了答案。我应该使用这个:setMyVariable(1);打电话到这件事上。与我所需要的完全不同,但至少现在我知道如何打电话到某件事上。谢谢你关于while的信息(真的)…很高兴知道。