IntentService中的数据库操作导致应用程序暂停,变得无响应并给出ANR

时间:2016-06-21 10:00:15

标签: android retrofit android-intentservice jsonschema2pojo

我在警报管理器中使用IntentService,每15秒触发一次。 我必须不断向服务器发送大量数据并在后台接收大量数据。 我必须遵循以下流程:

  1. 我正在通过查询从数据库中读取数据。

  2. 然后通过POJO架构将其转换为Json。

  3. 使用Retrofit Library将此JSON请求发送到服务器。

  4. 接收数据作为回应。

  5. 如果数据库中有任何更新,则通过某些查询将此数据插入我的数据库。

  6. 有替代方法吗?因为我正面临着ANR。 如果数据较少,则其工作正常。但随着数据量变大,UI停止运行,应用程序变得无法响应。

2 个答案:

答案 0 :(得分:4)

经过多次努力,我终于找到了解决方案:

我只是使用单独的流程来处理intent-service。

在" 清单"中使用此功能文件

 <service android:name=".BackgroundSyncDataService"
        android:process=":my_process">
  </service>

说明:

名称前面的冒号前缀告诉Android该服务对其声明的应用程序是私有的。如果未使用冒号,则服务将是一个全局进程,可供其他Android应用程序使用。

在自己的进程中运行服务会为其提供自己的内存地址空间,此过程中虚拟机的垃圾收集器不会影响应用程序进程。

如果服务在其主线程中执行长时间运行的操作,则在其自己的进程中运行服务不会阻止应用程序。

答案 1 :(得分:0)

为避免ANR,使用IntentService时需要记住几个关键点:

  • 在onCreate或onStartCommand中进行密集工作 - 两者仍然是UI线程
  • 在ResultReceiver中进行密集的工作
  • 不要在服务中启动自己的线程 - 它已经自己做了
  • 在onHandleIntent
  • 中执行您的密集工作
  • 执行设计您的架构,以便您收到的唯一数据是已更改的数据
  • 执行避免转移到其他进程 - 因为这会产生CPU和内存开销(对用户不利)

另一种解决方案是切换到另一种类型的服务并启动HandlerThread(或者只是从后台线程启动服务本身 - 因为服务在启动它的线程上运行)