在IntentService中进行数据库操作会导致应用程序停止响应并出现ANR问题。

11

我在闹钟管理器中使用了IntentService以便每15秒触发一次。我需要在后台不断发送大量数据到服务器,并接收大量响应数据。

我需要按照以下流程进行:

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

  2. 通过POJO架构将其转换为JSON格式。

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

  4. 接收响应数据。

  5. 如果数据库有更新,则通过特定的查询将此数据插入到我的数据库中。

是否有任何替代方法?因为我遇到了ANR问题。如果数据较少,则运行良好。但是随着数据大小变大,UI会停顿,应用程序变得无响应。

2个回答

4

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

我只是使用了单独的进程来处理意图服务。

在"清单"文件中使用此方法。

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

在名称前的冒号前缀告诉Android该服务是其声明应用程序的私有服务。如果不使用冒号,该服务将是全局进程,并可被其他Android应用程序使用。

在其自己的进程中运行服务会使其拥有自己的内存地址空间和虚拟机的垃圾回收器,不会影响应用程序进程。

在其自己的进程中运行服务不会阻塞应用程序,即使该服务在其主线程中执行长时间运行操作。


0
为了避免ANR,使用IntentService时需要记住以下几点:
  • 不要在onCreate或onStartCommand中进行密集型工作 - 这两个方法仍然在UI线程中执行
  • 不要在ResultReceiver中进行密集型工作
  • 不要在服务中启动自己的线程 - 它已经自己完成了这个任务
  • 应该在onHandleIntent中进行密集型工作
  • 应该设计架构,使得你只接收到已更改的数据
  • 应该避免切换到另一个进程 - 因为这会增加CPU和内存开销(对用户不好)

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


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