我正在将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);
答案 0 :(得分:0)
来自Android Docs:
AsyncTask旨在成为Thread和Handler的辅助类 并不构成通用的线程框架。 AsyncTasks 理想情况下应该用于短期操作(几秒钟的时间) 大多数。)如果你需要保持线程长时间运行, 强烈建议您使用提供的各种API java.util.concurrent包,如Executor,ThreadPoolExecutor和 FutureTask。
答案 1 :(得分:0)
你应该尝试延迟加载图像的概念。有各种jar文件或开源库可用于相同目的。其中一些人正在追随。
尝试上述任何一种库。它会解决你的问题。
答案 2 :(得分:0)
默认情况下,AsyncTasks在串行执行程序上运行。这意味着当一个任务正在进行时,另一个任务等到处理任务没有完成。您应该在线程池执行程序上运行任务:
task.runOnExecutor(THREAD_POOL_EXECUTOR);
但正确的解决方案是使用一些现有的库。