重复使用 OfflineTileProvider 会冻结应用程序

Repeated use of OfflineTileProvider freezes app

我有一个 activity,其中有一个包含 MapView 的片段。 MapView 使用 OfflineTileProvider,使用 CacheManager 下载图块。重复进入和退出 activity 时,应用程序有时会卡住。有时它会在重新访问 activity 一次或两次后发生,有时需要更多次(20 次或更多)才能冻结。

每次我输入 activity 都会抛出两种异常,第一种是:

Error loading tile
                                                      java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed.
                                                          at android.database.sqlite.SQLiteConnectionPool.throwIfClosedLocked(SQLiteConnectionPool.java:962)
                                                          at android.database.sqlite.SQLiteConnectionPool.waitForConnection(SQLiteConnectionPool.java:677)
                                                          at android.database.sqlite.SQLiteConnectionPool.acquireConnection(SQLiteConnectionPool.java:348)
                                                          at android.database.sqlite.SQLiteSession.acquireConnection(SQLiteSession.java:894)
                                                          at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:834)
                                                          at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62)
                                                          at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:145)
                                                          at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:134)
                                                          at org.osmdroid.tileprovider.modules.MapTileSqlCacheProvider$TileLoader.loadTile(MapTileSqlCacheProvider.java:209)
                                                          at org.osmdroid.tileprovider.modules.MapTileModuleProviderBase$TileLoader.run(MapTileModuleProviderBase.java:297)
                                                          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                                                          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
                                                          at java.lang.Thread.run(Thread.java:760)

第二个:

Unable to store cached tile from Mapnik /0/0/0 db is null
                                                      java.lang.NullPointerException: Attempt to invoke virtual method 'int android.database.sqlite.SQLiteDatabase.delete(java.lang.String, java.lang.String, java.lang.String[])' on a null object reference
                                                          at org.osmdroid.tileprovider.modules.SqlTileWriter.saveFile(SqlTileWriter.java:175)
                                                          at org.osmdroid.tileprovider.modules.MapTileDownloader$TileLoader.loadTile(MapTileDownloader.java:251)
                                                          at org.osmdroid.tileprovider.modules.MapTileModuleProviderBase$TileLoader.run(MapTileModuleProviderBase.java:297)
                                                          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
                                                          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
                                                          at java.lang.Thread.run(Thread.java:760)

有没有其他人遇到过类似的问题,或者知道该怎么办?

这很有趣。看起来像 lifecycle/concurrency 问题。地图片段的旧实例可能仍然存在。您可以通过强制 android 立即执行来解决此问题:

来自 osmdroid test/instrumentation 包

fm.beginTransaction().replace(org.osmdroid.R.id.samples_container, basefrag, ExtraSamplesActivity.SAMPLES_FRAGMENT_TAG) .addToBackStack(ExtraSamplesActivity.SAMPLES_FRAGMENT_TAG).commit(); fm.executePendingTransactions();

基本上,它会强制片段事务立即发生,这应该会强制 android 生命周期的事情发生。

另一种可能性是您有对地图的静态引用或保存在地图引用或您的离线图块提供程序实例上的东西。这些有可能吗?

编辑:我只是通过多次加载和卸载地图来测试片段中的地图,但无法重现它。您是以编程方式创建地图还是使用 xml 布局?