Android-我应该使用什么来不断检查布尔值,直到它为真?
我正在开发一个Android应用程序,它有一个页面,需要连接处于活动状态,并且需要在允许用户进入下一步之前从设备收集特定信息 我正在使用AsyncTask检查这两个布尔值。如果其中任何一个为“false”,则会显示一个祝酒词。然后它将Thread.sleep 1秒,再次检查并再次吐司,直到两个布尔值都为真或它们已离开页面 我们昨天了解到的问题是,Thread.sleep休眠线程池中的所有异步任务。因此,它还使连接任务处于休眠状态,使我们无法成功连接 我的另一个计划是将我当前的任务切换到一个定时任务,直到我读到它“在Android中不受欢迎”(但文章的链接被破坏): 我觉得首先生成一个线程来检查两个布尔值的状态不是一个好主意,但我不知道如何处理它。谢谢你的建议 编辑:Android-我应该使用什么来不断检查布尔值,直到它为真?,android,timer,android-asynctask,Android,Timer,Android Asynctask,我正在开发一个Android应用程序,它有一个页面,需要连接处于活动状态,并且需要在允许用户进入下一步之前从设备收集特定信息 我正在使用AsyncTask检查这两个布尔值。如果其中任何一个为“false”,则会显示一个祝酒词。然后它将Thread.sleep 1秒,再次检查并再次吐司,直到两个布尔值都为真或它们已离开页面 我们昨天了解到的问题是,Thread.sleep休眠线程池中的所有异步任务。因此,它还使连接任务处于休眠状态,使我们无法成功连接 我的另一个计划是将我当前的任务切换到一个定时任
我已将问题改写得更清楚。最好收听
蓝牙连接状态更改意图,如果连接从断开连接到已连接,您将通过意图(广播接收器
)了解。
您不需要每隔一秒钟左右检查一次状态
请参阅下面的答案,了解如何注册活动
另请参见原始问题中有关蓝牙设备的部分,您应该使用广播接收器,并收听特定的系统操作,如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);