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

时间:2015-04-15 09:12:50

标签: android timer android-asynctask

我正在开发一个Android应用,其中包含一个需要连接处于活动状态的页面,并且在允许用户进入下一步之前需要从设备收集某些信息。

使用AsyncTask来检查这两个布尔值。如果他们中的任何一个是“假”,那么它会显示一个Toast。然后它将Thread.sleep持续1秒,再次检查并再次烘烤,直到两个布尔都为真或他们离开页面。

我们昨天得知的问题是Thread.sleep在线程池中休眠所有异步任务。所以它也在睡眠Connection AsyncTask并阻止我们能够成功连接。

我的另一个计划是将当前的任务切换到预定的计时器,直到我读到它"在Android中不鼓励" (但文章的链接已被破坏):Android Asynctask vs Runnable vs timertask vs Service

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

修改 我已将问题改写为更清楚。

3 个答案:

答案 0 :(得分:0)

最好听取Bluetooth连接状态更改意图,如果连接从 DISCONNECTED 连接到 CONNECTED ,您将通过{{1}知道}(Intent)。 您不需要每隔一秒左右检查一次状态。

请参阅以下答案,了解如何注册活动。

How to register intent for Connection States

另见Android Documentation

答案 1 :(得分:0)

关于原始问题中的蓝牙设备,您应该使用BroadcastReceiver并监听特定的系统操作,例如BluetoothDevice.ACTION_ACL_CONNECTEDBluetoothDevice.ACTION_ACL_DISCONNECTEDBluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED

这样,您可以让应用程序更新已连接设备的状态。

现在,对于您最近的修改,您应该使用HandlerRunnable。声明两者都是Activity的成员,并在您的活动的Runnable上启动onResume()

myHandler.postDelayed(myRunnable, 1000);

您的Runnable应如下:

private Runnable myRunnable = new Runnable() {

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

        if (logic not present) {
            myHandler.postDelayed(myRunnable, 1000);
        }
    }
};

Runnable内,检查您的变量是否符合您的要求。如果他们不这样做,您可以使用Handler再次运行Runnable。最后一件事,在Activity onPause()上,您应该阻止Runnable运行:

myHandler.removeCallbacks(myRunnable);

希望有所帮助。

答案 2 :(得分:0)

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

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

执行.execute();

这将使其他AsyncTasks无干扰地运行,一次允许多个线程。