I've this snippet of code which I would like to optimize it. I've a method which is been called regularly by the OSMdroid library to load tons of maptiles. This method directly invokes the filestream and load the bitmap directly and will return the bitmap once loaded on the main UI thread.
Although I've managed to run in the background using AsyncTask
with parallel executor. Sometimes with plenty number of overlays (itemized) in the mapview this snippet of code runs slower as GC_FO_ALLOC
is triggered regularly for allocation, and in my log messages I get Grow Heap (frag case)
. I tried many ways to work around, but not effective enough. For some reason this task is being executed on main thread is my feeling as in my log messages I also get Skipped xx frames, the application may be doing lot of task
. Any idea how can this be made better? The thing is method has to return back, as soon as it loads, there by how can I allow this method to wait until mapview is not panned or zoomed, then load the tiles?
@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;
}
}