Android-我应该使用什么来不断检查布尔值,直到它为真?

Android-我应该使用什么来不断检查布尔值,直到它为真?,android,timer,android-asynctask,Android,Timer,Android Asynctask,我正在开发一个Android应用程序,它有一个页面,需要连接处于活动状态,并且需要在允许用户进入下一步之前从设备收集特定信息 我正在使用AsyncTask检查这两个布尔值。如果其中任何一个为“false”,则会显示一个祝酒词。然后它将Thread.sleep 1秒,再次检查并再次吐司,直到两个布尔值都为真或它们已离开页面 我们昨天了解到的问题是,Thread.sleep休眠线程池中的所有异步任务。因此,它还使连接任务处于休眠状态,使我们无法成功连接 我的另一个计划是将我当前的任务切换到一个定时任

我正在开发一个Android应用程序,它有一个页面,需要连接处于活动状态,并且需要在允许用户进入下一步之前从设备收集特定信息

我正在使用AsyncTask检查这两个布尔值。如果其中任何一个为“false”,则会显示一个祝酒词。然后它将Thread.sleep 1秒,再次检查并再次吐司,直到两个布尔值都为真或它们已离开页面

我们昨天了解到的问题是,Thread.sleep休眠线程池中的所有异步任务。因此,它还使连接任务处于休眠状态,使我们无法成功连接

我的另一个计划是将我当前的任务切换到一个定时任务,直到我读到它“在Android中不受欢迎”(但文章的链接被破坏):

我觉得首先生成一个线程来检查两个布尔值的状态不是一个好主意,但我不知道如何处理它。谢谢你的建议

编辑:
我已将问题改写得更清楚。

最好收听
蓝牙连接状态更改意图,如果连接从断开连接到已连接,您将通过
意图
广播接收器
)了解。 您不需要每隔一秒钟左右检查一次状态

请参阅下面的答案,了解如何注册活动


另请参见原始问题中有关蓝牙设备的部分,您应该使用
广播接收器
,并收听特定的系统操作,如
BluetoothDevice.ACTION\u ACL\u CONNECTED
BluetoothDevice.ACTION\u ACL\u DISCONNECTED
BluetoothHeadset.ACTION\u CONNECTION\u STATE\u CHANGED

这样,您就可以随时更新应用程序中已连接设备的状态

现在,对于您最近的编辑,您应该为此使用
处理程序和
可运行处理程序。将两者声明为
活动的成员
,并在活动的
onResume()上启动
可运行

您的
Runnable
应该如下所示:

private Runnable myRunnable = new Runnable() {

    @Override
    public void run() {
        //Check your logic here

        if (logic not present) {
            myHandler.postDelayed(myRunnable, 1000);
        }
    }
};
Runnable
中,检查变量是否与所需匹配。如果没有,则使用
处理程序
再次运行
Runnable
。最后一件事,在您的
活动中
onPause()
您应该停止运行
Runnable

myHandler.removeCallbacks(myRunnable);

希望这能有所帮助。

另外两个人为您提供了可能应该使用的清洁解决方案。然而,我认为如果您不想重新编写代码,有一个快速而肮脏的解决方案

问题是
AsyncTask
的默认行为;它们依次运行。因此,当线程休眠时,其他任务只是排队等待它完成。要更改此行为,您可以使用
.executeOnExecutor()执行
异步任务
而不是
。执行()


这将使其他异步任务在不受干扰的情况下运行,一次允许多个线程。

我可能应该告诉大家,我已经这样运行它们了:task.executeOnExecutor(AsyncTask.THREAD\u POOL\u EXECUTOR);然而,Thread.sleep似乎仍然会影响他们两个。在这种情况下,其他两种解决方案适用:无论如何谢谢你!如果您能找到任何关于Thread.sleep为什么会影响这两个方面的文档,那就太好了。我找不到任何东西。谢谢你的建议!然而,对于这个特定的用例,我无法使用这种方法。请看我问题的编辑。“我可能应该提到我不能听BluetoothReceiver,因为实际上我正在检查两个布尔值。”这并不能解释为什么你不能使用它。例如,这些布尔值可以保存在
SharedReferences
上,因此您可以在接收广播时检索它们的状态。正确,这并不意味着我不能使用它。然而,这是多余的。我仍然需要一个解决方案来定期检查第二个布尔值,直到它为“真”。无论您试图做什么,定期检查连接的设备都是不好的。您永远无法确定蓝牙设备何时会再次连接。如果永远不会呢?你的应用程序将毫无理由地浪费资源。使用广播使您的应用程序不断更新已连接设备的状态,并在读取设备的已知状态时定期检查其他布尔值。同意。正如我在最初的最后一段中提到的,生成一个线程来监听变量的变化“不是一个好主意”。我更愿意注册一个监听器或其他东西,但我不确定如何注册…因此,我提出了一个问题。因此,我回答了有关连接设备的问题:P
myHandler.removeCallbacks(myRunnable);