2015-10-26 3 views
0

В настоящее время я загружаю изображения с URL-адреса, и он уходит в длину, и я не могу понять, почему, иногда занимает больше 60 секунд, чтобы получить изображения, которые на самом деле не являются это большой.Изображение Android занимает много времени, чтобы получить от URL

Мой код:

Получить изображение асинхронная задача:

public class GetImageAsyncTask extends AsyncTask<Void, Void, Bitmap> { 

String url; 
OnImageRetrieved listener; 
ImageView imageView; 
int height; 
int width; 

public GetImageAsyncTask(String url, ImageView imageView,OnImageRetrieved listener, int height, int width) { 
    this.url = url; 
    this.listener = listener; 
    this.imageView = imageView; 
    this.height = height; 
    this.width = width; 
} 

public interface OnImageRetrieved { 
    void onImageRetrieved(Bitmap image, ImageView imageview, String url); 
} 

protected Bitmap doInBackground(Void... params) { 

    Bitmap image = null; 

    try { 
     image = ImageUtilities.decodeSampledBitmapFromUrl(this.url, this.width, this.height); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return image; 
} 

    protected void onPostExecute(Bitmap result) { 
     this.listener.onImageRetrieved(result, this.imageView, this.url); 
    } 
} 

public static Bitmap decodeSampledBitmapFromUrl(String url, int reqWidth, int reqHeight) throws IOException { 

    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 

    BitmapFactory.decodeStream(new java.net.URL(url).openStream(), null, options); 

    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

    options.inJustDecodeBounds = false; 

    return BitmapFactory.decodeStream(new java.net.URL(url).openStream(), null, options); 
} 

Получение Размер выборки:

public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { 

    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if (height > reqHeight || width > reqWidth) { 

     final int halfHeight = height/2; 
     final int halfWidth = width/2; 

     while ((halfHeight/inSampleSize) > reqHeight 
       && (halfWidth/inSampleSize) > reqWidth) { 
      inSampleSize *= 2; 
     } 
    } 

    return inSampleSize; 
} 

Эти методы используются из-за осложнений памяти, которые могут возникнуть, если нет, но время, которое, по-видимому, занимает всего лишь долгое время. Есть ли какие-то очень тяжелые вычисления, которые я просто не вижу или?

+0

так насколько велики они на стороне сервера? что такое значение 'options.outHeight' и' options.outWidth'? – pskink

+0

Изображения на s3 варьируются от 300 до 1100 КБ, поэтому я имею в виду не совсем массивный. Ширина может быть где-нибудь между 500-2000, высота 400- 1200. Подумайте ив попадались еще один вопрос, мой адаптер GetView становится называется способом много раз, которое приводит к буквально 100-х звонков на мой getIMageAsyncTask –

ответ

1

вы можете использовать библиотеку Picasso или volly для загрузки изображения. Я предлагаю использовать волю, потому что ее представляет сам Google.

+0

Im маркировки это как правильно, потому что, честно говоря, Пикассо спас мне 10 часов, я понятия не имею, что так сложно справляться с изображениями в андроидном рюкзаке, что, несомненно, решает проблему. –

0

Таким образом, проблема связана с адаптером массива, и тот факт, что getView() может быть вызван 100 раз, который может быть близок к 100 МБ данных, загружается одновременно.

Так как временное исправление для этой ситуации я реализовал глобальный синглтон LruCache, который я сначала проверяю перед запуском задачи async.

Это явно не идеально, но сейчас это нужно будет сделать. Я уверен, что там есть лучшие решения, и я хотел бы услышать их, если кто-нибудь предложит.

Смежные вопросы