Загрузка маркеров 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. Таким образом, каждый раз загрузка маркеров из сети не занимает больше времени.

http://developand.blogspot.in/2010/11/lazy-loading.html

Другие вопросы по тегам