优化android代码片段-更好的设计方法?
我有这段代码,我想对其进行优化。我有一个方法,OSMdroid库定期调用它来加载成吨的MapTile。此方法直接调用filestream并直接加载位图,并在主UI线程上加载后返回位图 虽然我已经设法在后台运行了AsyncTask和并行执行器。有时,在mapview中列出了大量的覆盖项,这段代码运行得比较慢,因为GC_fou__ALLOC定期被触发进行分配,在我的日志消息中,我得到了Grow Heap frag。我尝试了很多方法来解决这个问题,但不够有效。由于某种原因,我感觉这个任务是在主线程上执行的,因为在我的日志消息中,我也得到了跳过的xx帧,应用程序可能正在执行很多任务。你知道怎样才能做得更好吗?问题是,这个方法必须返回,一旦加载,我怎么能让这个方法等到mapview没有平移或缩放,然后加载瓷砖优化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。我尝试了很多方法来解决这个问题,但不够有效。由于某种原因,我感觉这个任务是在主线程上执
@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,只有当你有足够的覆盖时才会出现缓慢显示。这是一个正确的描述吗?是的,就是这样!当我清除所有覆盖层时,地图视图恢复正常。