Асинктаск в ImageGetter очень медленно при загрузке изображений

Я разбираю bbcode в html и отображаю его внутри textview. Я использую ImageGetter() для отображения изображений, загруженных из AsyncTask. У меня нет проблем с небольшим количеством изображений. Проблема возникает, когда количество изображений увеличивается

Как мне решить проблему медленной загрузки с помощью имидж-геттера?

вот парсер изображений:

public class URLImageParser implements ImageGetter {
Context c;
TextView container;
int width = 0;
int height = 0;

public URLImageParser(TextView t, Context c) {
    this.c = c;
    this.container = t;
    width = container.getWidth();
    height = 0;
 }

public Drawable getDrawable(String source) {
    Log.e("GeTDRAWABLE ", source);
    final URLDrawable urlDrawable = new URLDrawable();


    new AsyncTask<String, Void, Drawable>()  {
        @Override
        protected void onPreExecute() {
        }

        @Override
        protected Drawable doInBackground(String... params) {
            String source = params[0];
            try {
                InputStream is = fetch(source);
                Log.e("InputStream",is.toString());
                Drawable drawable = Drawable.createFromStream(is, "src");
                return drawable;
            } catch (Exception e) {
                return null;
            } 
        }

        @Override 
        protected void onPostExecute(Drawable result) { 
            int wi = result.getIntrinsicWidth(); 
            int hi = result.getIntrinsicHeight(); 
            int dimDiff = Math.abs(wi - width) - Math.abs(hi - height); 
            float scale = (dimDiff > 0) ? width/(float)wi : height/ (float)hi; 
            Rect bounds = new Rect(0, 0, (int)(scale*wi), (int)(scale*hi)); 
            result.setBounds(bounds);  
            urlDrawable.setBounds(bounds); 
            urlDrawable.drawable = result;               
            URLImageParser.this.container.setHeight((URLImageParser.this.container.getHeight()  +  (int)(scale*hi) ));
            URLImageParser.this.container.invalidate();
        } 

        private InputStream fetch(String urlString) throws MalformedURLException, IOException {
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpGet request = new HttpGet(urlString);
            HttpResponse response = httpClient.execute(request);
            return response.getEntity().getContent();
        }

    }.execute(source);
    return urlDrawable;
}


private class URLDrawable extends BitmapDrawable {
    protected Drawable drawable;

    @Override
    public void draw(Canvas canvas) {
        if(drawable != null) {
            drawable.draw(canvas);
        }
    }
 }
}

здесь я звоню ImageGetter():

URLImageParser p = new URLImageParser(mTextView, mContext);

3 ответа

Вы должны попробовать концепцию отложенной загрузки изображений. Для этой цели доступны различные jar-файлы или библиотеки с открытым исходным кодом. Некоторые из них следующие.

  1. Загрузчик изображений
  2. Универсальный загрузчик изображений
  3. Запрос

Попробуйте любую из вышеперечисленных библиотек. это решит вашу проблему.

По умолчанию AsyncTasks запускаются на последовательном исполнителе. Это означает, что пока одна задача выполняется, другая ждет, пока задача обработки не будет завершена. Вы должны запустить свою задачу на исполнителе пула потоков:

task.runOnExecutor(THREAD_POOL_EXECUTOR);

но ПРАВИЛЬНОЕ решение - использовать некоторые из существующих библиотек.

Из Android Документов:

AsyncTask разработан как вспомогательный класс для Thread и Handler и не представляет собой универсальную среду потоков. AsyncTasks в идеале следует использовать для коротких операций (максимум несколько секунд). Если вам нужно, чтобы потоки работали в течение длительного периода времени, настоятельно рекомендуется использовать различные API, предоставляемые пакетом java.util.concurrent, такие как Executor, ThreadPoolExecutor и FutureTask.

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