我有一些关于 Android 的设计问题BroadcastReceiver
。
我的场景如下:当某个 wifi 网络连接时,检测是否有强制门户,如果有,则对其进行身份验证。该场景涉及网络 I/O,需要几秒钟才能完成(尤其是当您需要等待带有密码的 SMS 时)。
通过调试BroadcastReceiver
Wifi 状态更改,我发现它是在应用程序的主线程上调用的。这是几分钟后我不知道的事情。我是在说这个,而不是在问,因为这个问题也是我发现的结果。
在无线身份验证阶段,我应该处理用户突然断开连接(例如由于热点故障,用户超出范围......)并重新连接的情况,避免两个广播重叠并可能取消最终失败的身份验证.
在我发现 BroadcastReceiver 是在主线程中执行后,我得出的结论是我需要一个AsyncTask
来执行网络 I/O,但请随意提出其他想法。
问题是:如果在长时间运行的任务中间触发了连续广播,我该如何阻止它?事实上,AsyncTask
s 可以被取消,但是我怎样才能存储一个共享实例AsyncTask
以便从不同的 BroadcastReceiver 取消它而不会使我的生活变得太复杂?
AndroidBroadcastReceiver
是事实上的单例还是 Android 每次需要触发新的广播时都会创建一个声明接收器的新实例?