我想要对这段代码进行优化。我有一个方法,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;
}
}
答案 0 :(得分:0)
据我了解,您正在尝试使用osmdroid显示离线地图。
Android无法在内存中加载“吨地图图块”,因为它无法为每个应用程序提供足够的内存堆。
这就是为什么osmdroid具有高级机制(后台加载,LRU缓存......)
为什么你不只是使用这些标准的osmdroid机制?
查看这篇文章,了解有关osmdroid离线地图的更多详情:Download maps for osmdroid