gpt4 book ai didi

Android应用程序CursorWindow内存错误

转载 作者:太空宇宙 更新时间:2023-11-03 11:21:59 24 4
gpt4 key购买 nike

在运行我的应用程序几分钟后,我当前收到一个“IllegalStateException 无法初始化光标窗口”。当我的应用程序启动时,我启动了三个不同的服务,每个轮询(每 1 秒)一个不同的 RESTful Web 服务。在检索/解析结果后,每个服务都有一个 ContentProvider,它们将新数据插入其中。 ContentProvider 然后使用 setNotificationUri 让当前 Activity 知道有新数据可用(如果他们订阅了从该 URI 获取更新)。

第一个问题,这是轮询 RESTful 网络服务并将结果提供给感兴趣的 Activity 的正确方法吗?阅读this question的答案后,似乎 ContentProvider 是不必要的,因为一切都存在于同一个应用程序中。

第二个问题,是什么导致了 IllegalStateException?结果是没有足够的堆分配给 CursorWindow(cursorwindow 堆分配失败)。我认为问题可能是当我查询 ContentProvider 时(在收到通知后)它在游标中返回了太多结果。 Activity 实际上只需要收到的最后更新,所以我添加了一个 ORDER BY "ID"DESC 并将结果限制为 1。因此 ContentProvider 每次应该只返回 1 个结果。这并没有真正产生任何影响。

对第一个问题的任何帮助也可能解决第二个问题。我读了一些地方不要在 Activity 中进行 Web 服务调用,这导致我使用 Service 类来轮询 Web 服务。仅供引用,这是一个只有几个客户端的内部应用程序。

感谢任何反馈。

编辑:以下是其中一个查询的必要代码:

Cursor geoEllipseDatas = managedQuery(GeoEllipseDataProvider.GEO_ELLIPSE_CONTENT_URI,
projection, null, null, GeoEllipseDataProvider.ID + " DESC");
boolean dataAvailable = geoEllipseDatas.moveToLast();

if (dataAvailable) {
// parse the data out of the cursor
String targetId = geoEllipseDatas.getString(1);
...
}

最佳答案

  1. 在采用了两种方法(ContentProvider 和直接数据库访问)之后,我个人发现 ContentProvider 是一个较少的错误来源。它们真的很容易访问/设置,只需使用内容解析器即可,它们会迫使您真正考虑 URI,并且您将获得与它们相关的所有好处(例如这些 URI 上的 Intent 过滤器,...)。

  2. 确保您正确地关闭游标、释放内存……没有任何代码很难说。


根据我对 managedQuery 用例的理解,您应该在 Activity 的 onCreate 方法中调用它。如果您在其他地方调用它,我认为调用 stopManagingCursor 是安全的在执行另一个 managedQuery 之前(我不知道该函数是否会自动为您执行,需要查看源代码)。

此外,问题可能出在您的内容提供者中,它会在该游标上触发更新,会触发另一个查询,会触发更新,会...

关于Android应用程序CursorWindow内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6790507/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com