IntentService 中的数据库操作导致应用程序停止、变得无响应并给出 ANR
Database operations in IntentService results into application halt,become unresponsive and giving ANR
我在警报管理器中使用 IntentService 每 15 秒触发一次。
我必须不断向服务器发送大量数据并在后台接收大量数据作为响应。
我必须遵循以下流程:
我正在通过查询从数据库读取数据。
然后通过POJO架构在Json中转换
使用 Retrofit 库将此 JSON 请求发送到服务器。
正在接收响应数据。
如果数据库中有任何更新,则通过某些查询将此数据插入我的数据库。
有没有替代方法?因为我正面临 ANR。
如果数据较少,则可以正常工作。但是随着数据量越来越大,UI 暂停并且应用程序变得无响应。
经过一番努力终于找到了解决方案:
我只是使用单独的进程来处理 intent-service。
在“Manifest”文件中使用它
<service android:name=".BackgroundSyncDataService"
android:process=":my_process">
</service>
描述:
名称前面的冒号前缀告诉 Android 该服务对其声明的应用程序是私有的。如果不使用冒号,该服务将是一个全局进程,可以被其他 Android 应用程序使用。
运行一个服务在它自己的进程中给它自己的内存地址space并且这个进程中虚拟机的垃圾收集器不影响应用进程。
运行 如果服务在其主线程中执行长 运行 操作,则其自身进程中的服务不会阻塞应用程序。
为避免 ANR,在使用 IntentService 时要记住几个要点:
- 不要 在 onCreate 或 onStartCommand 中做大量工作 - 两者仍然是 UI 线程
- 不要在 ResultReceiver 中做大量工作
- 不要在服务中启动您自己的线程 - 它自己已经这样做了
- 在 onHandleIntent
中做 大量工作
- 设计您的架构,以便您收到的唯一数据是已更改的数据
- 不要 避免移动到另一个进程 - 因为这有 CPU 和内存开销(对您的用户不利)
另一种解决方案是切换到其他类型的服务并启动 HandlerThread(或者只是从后台线程启动服务本身 - 因为服务在启动它的线程上运行)
我在警报管理器中使用 IntentService 每 15 秒触发一次。 我必须不断向服务器发送大量数据并在后台接收大量数据作为响应。 我必须遵循以下流程:
我正在通过查询从数据库读取数据。
然后通过POJO架构在Json中转换
使用 Retrofit 库将此 JSON 请求发送到服务器。
正在接收响应数据。
如果数据库中有任何更新,则通过某些查询将此数据插入我的数据库。
有没有替代方法?因为我正面临 ANR。 如果数据较少,则可以正常工作。但是随着数据量越来越大,UI 暂停并且应用程序变得无响应。
经过一番努力终于找到了解决方案:
我只是使用单独的进程来处理 intent-service。
在“Manifest”文件中使用它
<service android:name=".BackgroundSyncDataService"
android:process=":my_process">
</service>
描述:
名称前面的冒号前缀告诉 Android 该服务对其声明的应用程序是私有的。如果不使用冒号,该服务将是一个全局进程,可以被其他 Android 应用程序使用。
运行一个服务在它自己的进程中给它自己的内存地址space并且这个进程中虚拟机的垃圾收集器不影响应用进程。
运行 如果服务在其主线程中执行长 运行 操作,则其自身进程中的服务不会阻塞应用程序。
为避免 ANR,在使用 IntentService 时要记住几个要点:
- 不要 在 onCreate 或 onStartCommand 中做大量工作 - 两者仍然是 UI 线程
- 不要在 ResultReceiver 中做大量工作
- 不要在服务中启动您自己的线程 - 它自己已经这样做了
- 在 onHandleIntent 中做 大量工作
- 设计您的架构,以便您收到的唯一数据是已更改的数据
- 不要 避免移动到另一个进程 - 因为这有 CPU 和内存开销(对您的用户不利)
另一种解决方案是切换到其他类型的服务并启动 HandlerThread(或者只是从后台线程启动服务本身 - 因为服务在启动它的线程上运行)