Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化android代码片段-更好的设计方法?_Android_Multithreading_Bitmap_Android Asynctask_Osmdroid - Fatal编程技术网

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

优化android代码片段-更好的设计方法?,android,multithreading,bitmap,android-asynctask,osmdroid,Android,Multithreading,Bitmap,Android Asynctask,Osmdroid,我有这段代码,我想对其进行优化。我有一个方法,OSMdroid库定期调用它来加载成吨的MapTile。此方法直接调用filestream并直接加载位图,并在主UI线程上加载后返回位图 虽然我已经设法在后台运行了AsyncTask和并行执行器。有时,在mapview中列出了大量的覆盖项,这段代码运行得比较慢,因为GC_fou__ALLOC定期被触发进行分配,在我的日志消息中,我得到了Grow Heap frag。我尝试了很多方法来解决这个问题,但不够有效。由于某种原因,我感觉这个任务是在主线程上执

我有这段代码,我想对其进行优化。我有一个方法,OSMdroid库定期调用它来加载成吨的MapTile。此方法直接调用filestream并直接加载位图,并在主UI线程上加载后返回位图

虽然我已经设法在后台运行了AsyncTask和并行执行器。有时,在mapview中列出了大量的覆盖项,这段代码运行得比较慢,因为GC_fou__ALLOC定期被触发进行分配,在我的日志消息中,我得到了Grow Heap frag。我尝试了很多方法来解决这个问题,但不够有效。由于某种原因,我感觉这个任务是在主线程上执行的,因为在我的日志消息中,我也得到了跳过的xx帧,应用程序可能正在执行很多任务。你知道怎样才能做得更好吗?问题是,这个方法必须返回,一旦加载,我怎么能让这个方法等到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;
        }
    }

据我所知,您正在尝试使用osmdroid显示脱机地图

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

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

为什么不使用这些标准的osmdroid机制


有关osmdroid上离线地图的更多详细信息,请参阅本文:

我的mapview在没有覆盖的情况下工作得非常好,GC有时会触发分配内存,但它完成得非常快,maptiles可以正常快速地加载。对于您所说的,osmdroid具有高级机制后台加载、LRU缓存、, ... 我曾试着问过如何使用MapTileLRUcache进行缓存,但后来我明白了OSMdroid在内部使用它,所以再次使用它没有多大意义。虽然我想知道或任何例子,如何在后台加载?我目前正在使用AsyncTask加载分幅,使其在后台强制运行,如何优化上面显示的代码?我确实看到了您的脱机地图教程,很好。但我需要非常灵活,因为我的是与定制瓷砖相似的图案。因此,我继承了XYTileSource来创建我自己的类。如果我错了,请纠正我:当您没有足够的覆盖时,您对自定义XYTileSource没有任何问题:您的地图视图工作正常,地图分幅加载正常,平移和缩放速度很快。问题很多完全GC,只有当你有足够的覆盖时才会出现缓慢显示。这是一个正确的描述吗?是的,就是这样!当我清除所有覆盖层时,地图视图恢复正常。