Загрузка маркеров ItemizedOverlays из Интернета
Мне было интересно, как правильно загружать маркеры ItemizedOverlay из Интернета, использовать кэширование каким-то образом.
Прямо сейчас я загружаю все изображения и преобразовываю их в drawables, это работает просто отлично, но я хочу видеть, есть ли лучший способ сделать это.
public class ImageLoad extends AsyncTask<String, Bitmap, Bitmap> {
private String url;
private MapView mapView;
public ImageLoad() {
}
public ImageLoad(MapView mapView) {
this.mapView = mapView;
}
protected Bitmap doInBackground(String... params) {
url = params[0];
try {
return BitmapFactory.decodeStream(new URL(url).openConnection().getInputStream());
} catch (MalformedURLException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(Bitmap result) {
Drawable d = new BitmapDrawable(mapView.getContext().getResources(), result);
SimpleItemizedOverlay itemizedOverlay = new SimpleItemizedOverlay(d, mapView);
GeoPoint p = new GeoPoint(32061628, 34774767);
itemizedOverlay.addOverlay(new OverlayItem(p, "zzz", "zzz"));
mapView.getOverlays().add(itemizedOverlay);
mapView.invalidate();
super.onPostExecute(result);
}
}
3 ответа
Общий подход верен, но детали того, как вы его реализовали, могут быть улучшены.
Improvement 1
В вашем onPostExecute()
каждый раз, когда вы загружаете изображение, вы создаете новый ItemizedOverlay
объект и добавить один элемент к нему. В общем, более эффективно использовать уникальные ItemizedOverlay
и добавьте все предметы к нему.
- Создайте
ItemizedOverlay
и добавить его вMapView.getOverlays().add()
перед загрузкой первого изображения - + Изменить
ImageLoad
класс, чтобы получитьItemizedOverlay
вместоMapView
- В
onPostExecute()
создать новыйOverlayItem
и добавить его вItemizedOverlay
С этим у вас будет только один ItemizedOverlay
с несколькими предметами в нем. С вашим кодом у вас есть несколько ItemizedOverlays
с одним изображением каждый.
Improvement 2
Вы не изменяете размеры изображений, которые вы загружаете в Интернете. Если вы не уверены, что все они имеют подходящий размер, вы должны принудительно установить размер, прежде чем добавлять их в оверлей. В противном случае вы будете использовать больше памяти и можете получить изображение, которое покрывает весь экран, а это не то, чего ожидает пользователь.
Вы можете изменить размер Bitmap
используя метод Bitmap.createScaledBitmap()
,
С уважением.
Я бы посоветовал вам использовать изображение по умолчанию в качестве наложения для рисования, в то время как lazyLoader загружает изображения, помещает их в чашу (двухуровневый кеш: в памяти и на диск) и уведомляет о наложении, когда изображение готово, а затем обновляет его вид.,
Вы можете попробовать этот способ.... см. ссылку.. Это демо ленивой загрузки изображений, поэтому здесь загрузка изображений в первый раз и сохранение их кеша в SDCard. Таким образом, каждый раз загрузка маркеров из сети не занимает больше времени.