当图像加载时,imagegetter中的asynctask非常慢

时间:2014-12-24 13:09:58

标签: android android-asynctask

我正在将bbcode解析为html并将其显示在textview中。我使用ImageGetter()来显示从AsyncTask下载的图像。 对于少量图片我没有问题。当图像数量增加时出现问题

如何使用ımagegetter解决装载缓慢的问题?

这是图像解析器:

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 个答案:

答案 0 :(得分:0)

来自Android Docs

  

AsyncTask旨在成为Thread和Handler的辅助类   并不构成通用的线程框架。 AsyncTasks   理想情况下应该用于短期操作(几秒钟的时间)   大多数。)如果你需要保持线程长时间运行,   强烈建议您使用提供的各种API   java.util.concurrent包,如Executor,ThreadPoolExecutor和   FutureTask。

答案 1 :(得分:0)

你应该尝试延迟加载图像的概念。有各种jar文件或开源库可用于相同目的。其中一些人正在追随。

  1. Image Loader
  2. 通用图片加载器
  3. AQuery
  4. 尝试上述任何一种库。它会解决你的问题。

答案 2 :(得分:0)

默认情况下,AsyncTasks在串行执行程序上运行。这意味着当一个任务正在进行时,另一个任务等到处理任务没有完成。您应该在线程池执行程序上运行任务:

task.runOnExecutor(THREAD_POOL_EXECUTOR);

但正确的解决方案是使用一些现有的库。