【问题标题】:optimize android code snippet - better design approach?优化 android 代码片段 - 更好的设计方法?
【发布时间】:2014-06-19 18:38:36
【问题描述】:

我有这个 sn-p 的代码,我想对其进行优化。我有一个由 OSMdroid 库定期调用的方法来加载大量的地图。此方法直接调用文件流并直接加载位图,并且在主 UI 线程上加载后将返回位图。

虽然我已经设法使用AsyncTask 和并行执行器在后台运行。有时,在 mapview 中有大量覆盖(逐项)时,此代码的 sn-p 运行速度较慢,因为定期触发 GC_FO_ALLOC 进行分配,并且在我的日志消息中我得到 Grow Heap (frag case)。我尝试了很多方法来解决,但都不够有效。出于某种原因,这个任务在主线程上执行是我的感觉,因为在我的日志消息中我也得到了Skipped xx frames, the application may be doing lot of task。知道如何使这变得更好吗?问题是方法必须返回,一旦加载,我怎么能让这个方法等到地图视图没有平移或缩放,然后加载图块?

@SuppressWarnings("deprecation")
    @Override
    public Drawable getDrawable(final InputStream aFileInputStream) throws LowMemoryException {

        try {
            df = new DisplayFile();
            df.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, aFileInputStream);
            return new BitmapDrawable(df.get());
        } catch (final OutOfMemoryError e) {
            System.gc();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        return null;
    }

private class DisplayFile extends AsyncTask<InputStream, Bitmap, Bitmap> {

        InputStream path;

        @Override
        protected Bitmap doInBackground(InputStream... arg0) {
            path = arg0[0];
            BitmapFactory.Options mBitOpt = new BitmapFactory.Options();
            mBitOpt.inDither = false;
            mBitOpt.inSampleSize = 1;
            mBitOpt.inPurgeable = true;
            mBitOpt.inInputShareable = true;
            mBitOpt.inPreferredConfig = Bitmap.Config.ARGB_8888;
            final Bitmap mBitmap = BitmapFactory.decodeStream(path,null,mBitOpt);
            return mBitmap;
        }
    }

【问题讨论】:

    标签: android multithreading bitmap android-asynctask osmdroid


    【解决方案1】:

    据我了解,您正在尝试使用 osmdroid 显示离线地图。

    Android 无法在内存中加载“大量地图图块”,因为它没有为每个应用程序提供足够的内存堆。

    这就是为什么 osmdroid 拥有先进的机制(后台加载、LRU 缓存……)

    为什么你不只是使用这些标准的 osmdroid 机制?

    有关 osmdroid 上的离线地图的更多详细信息,请查看此帖子:Download maps for osmdroid

    【讨论】:

    • 当没有叠加层时,我的 mapview 工作得很好,GC 有时会触发分配内存,但它完成得非常快,并且 maptile 加载正常且迅速。
    • 对你所说的再次提出问题,osmdroid has advanced mechanisms (background loading, LRU cache, ...) 我确实尝试过询问如何使用MapTileLRUcache 进行缓存,但后来我明白了OSMdroid 在内部使用它,所以它不会再次使用很有意义。虽然我想知道或任何如何在后台加载的例子?我目前正在使用AsyncTask 加载磁贴以使其在后台强制运行,如何优化上面显示的代码?
    • 我确实看过你的离线地图教程,很好。但我需要非常灵活,因为我的模式与自定义瓷砖相似。因此我继承XYTileSource 来创建我自己的类。
    • 如果我错了,请纠正我:当您没有“大量叠加层”时,您的自定义 XYTileSource 没有问题:您的地图视图工作正常,地图图块正常加载,平移和变焦很快。仅当您有“大量覆盖”时才会出现问题(大量完整的 GC,显示缓慢)。描述正确吗?
    • 是的,这就是总结!当我也清除所有叠加层时,地图视图会恢复并正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    相关资源
    最近更新 更多