优化android代码片段 - 更好的设计方法?

时间:2014-05-26 10:44:05

标签: android multithreading bitmap android-asynctask osmdroid

我想要对这段代码进行优化。我有一个方法,OSMdroid库定期调用它来加载大量的maptiles。此方法直接调用文件流并直接加载位图,并在主UI线程上加载后返回位图。

虽然我已经设法使用带有并行执行程序的AsyncTask在后​​台运行。有时在mapview中有大量的叠加(逐项列出),这段代码运行较慢,因为GC_FO_ALLOC会定期触发分配,而在我的日志消息中,我得到Grow Heap (frag case)。我尝试了很多方法来解决,但效果不够。出于某种原因,这个任务正在主线程上执行是我的感觉,因为在我的日志消息中我也得到Skipped xx frames, the application may be doing lot of task。不知道如何才能做得更好?方法必须返回,一旦加载,我怎么能让这个方法等到mapview没有被平移或缩放,然后加载瓷砖?

@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;
        }
    }

1 个答案:

答案 0 :(得分:0)

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

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

这就是为什么osmdroid具有高级机制(后台加载,LRU缓存......)

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

查看这篇文章,了解有关osmdroid离线地图的更多详情:Download maps for osmdroid