广播接收器在主线程上运行吗?

4
我正在使用MQTT服务器来开发我的应用程序。因此,我只能获取单个字符串数据而不是批量JSON数据。所以,如果有100条记录,我的广播接收器的onReceive将会被调用100次。我在接收器类中从接收到的字符串中提取数据并将其保存到数据库中。我知道通常广播接收器在主线程上运行,因此如果我按照这种方法进行操作,我的应用程序将会挂起。那么,适当的方法是什么?如果我想要在单独的线程中运行我的接收器,我该怎么做?
以下是我注册接收器的方式:
mMessageReceiver = new MQTTMessageReceiver();
IntentFilter intentFilter = new IntentFilter(MQTTService.MQTT_MSG_RECEIVED_INTENT);
registerReceiver(mMessageReceiver, intentFilter);

我曾经遇到过类似的问题,我的解决方法是在需要接收数据时注册接收器,在不急需获取数据的时候注销它,然后随着运行时间重复这个过程。我不知道这个方法是否适用于你。 - Muhammed Refaat
一种方法是启动一个服务。在这个服务上,您可以存储字符串,直到您想要的数字,然后使用事件总线库通知您的UI,有一大批数据需要显示。 - reixa
2
你可以在不同的线程中运行广播接收器。 - kalyan pvs
1个回答

1
所以我可以提出以下解决方案:
  1. 不要在BoradcastReceiver中进行重处理(但似乎这不是一个选项)
  2. 启动新的ThreadAsyncTask或Loader,或者任何您想使用的线程机制。 这将把计算密集型部分移动到单独的线程中,而不会阻塞UI。
  3. 正如axierjhtjz建议的那样,您可以运行一个IntentService(因为它创建了一个单独的工作线程),其中包含一个MQTTMessageReceiver(我假设这是BroadcastReceiver的子类),它将处理数据并通过另一个BroadcastReceiver通知UI线程。
个人建议使用第三种方法,因为它使您的应用程序更加模块化,意味着更容易支持和扩展过程。
编辑:我也考虑过第四种方式:
  1. 您可以使用此方法注册接收器,提供一个处理程序对象来标识将执行数据处理的线程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接