我正在开发一个Android应用,其中包含一个需要连接处于活动状态的页面,并且在允许用户进入下一步之前需要从设备收集某些信息。
我 使用AsyncTask来检查这两个布尔值。如果他们中的任何一个是“假”,那么它会显示一个Toast。然后它将Thread.sleep持续1秒,再次检查并再次烘烤,直到两个布尔都为真或他们离开页面。
我们昨天得知的问题是Thread.sleep在线程池中休眠所有异步任务。所以它也在睡眠Connection AsyncTask并阻止我们能够成功连接。
我的另一个计划是将当前的任务切换到预定的计时器,直到我读到它"在Android中不鼓励" (但文章的链接已被破坏):Android Asynctask vs Runnable vs timertask vs Service
我觉得产生一个线程来检查两个布尔值的状态首先不是一个好主意,但我不确定如何处理它。谢谢你的建议!
修改 我已将问题改写为更清楚。
答案 0 :(得分:0)
最好听取Bluetooth
连接状态更改意图,如果连接从 DISCONNECTED 连接到 CONNECTED ,您将通过{{1}知道}(Intent
)。
您不需要每隔一秒左右检查一次状态。
请参阅以下答案,了解如何注册活动。
答案 1 :(得分:0)
关于原始问题中的蓝牙设备,您应该使用BroadcastReceiver
并监听特定的系统操作,例如BluetoothDevice.ACTION_ACL_CONNECTED
,BluetoothDevice.ACTION_ACL_DISCONNECTED
和BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED
。
这样,您可以让应用程序更新已连接设备的状态。
现在,对于您最近的修改,您应该使用Handler
和Runnable
。声明两者都是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无干扰地运行,一次允许多个线程。