11

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

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

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

  3. 使用改造库将此 JSON 请求发送到服务器。

  4. 接收数据作为响应。

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

有没有替代方法?当我面临 ANR 时。如果数据较少,则工作正常。但随着数据量变大,UI 停止,应用程序变得无响应。

4

2 回答 2

4

经过一番挣扎,我终于找到了解决方案:

我只是使用单独的流程来为意图服务工作。

在“清单”文件中使用它

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

描述 :

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

在它自己的进程中运行一个服务给它自己的内存地址空间,并且这个进程中的虚拟机的垃圾收集器不会影响应用程序进程。

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

于 2016-06-27T05:20:50.083 回答
0

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

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

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

于 2018-03-27T11:39:14.253 回答