android异步图像url加载
我有一个自定义的ImageView子类,用于使用AsyncTask获取URL中的图像。但是,似乎无论我做什么,列表视图填充都会暂停,直到获取图像为止android异步图像url加载,android,android-listview,android-asynctask,Android,Android Listview,Android Asynctask,我有一个自定义的ImageView子类,用于使用AsyncTask获取URL中的图像。但是,似乎无论我做什么,列表视图填充都会暂停,直到获取图像为止 public void setImageURL(final String url) { // do we have url in the cache? Bitmap bitmap = mCache.getBitmap(url); if(bitmap == null) { new AsyncTask<Vo
public void setImageURL(final String url) {
// do we have url in the cache?
Bitmap bitmap = mCache.getBitmap(url);
if(bitmap == null) {
new AsyncTask<Void, Void, Bitmap>() {
protected Bitmap doInBackground(Void... p) {
Bitmap bm = null;
try {
URL aURL = new URL(url);
URLConnection conn = aURL.openConnection();
conn.setUseCaches(true);
conn.connect();
InputStream is = conn.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
bm = BitmapFactory.decodeStream(bis);
bis.close();
is.close();
} catch(IOException e) {
e.printStackTrace();
}
if(bm == null) {
return null;
}
return bm;
}
protected void onPostExecute(Bitmap bmp) {
if(bmp == null) {
return;
}
mCache.cacheBitmap(url, bmp);
setImageBitmap(bmp);
}
}.execute();
} else {
setImageBitmap(bitmap);
}
}
public void setImageURL(最终字符串url){
//缓存中有url吗?
位图Bitmap=mCache.getBitmap(url);
如果(位图==null){
新建异步任务(){
受保护位图doInBackground(无效…p){
位图bm=null;
试一试{
URL aURL=新URL(URL);
URLConnection conn=aURL.openConnection();
conn.SETUSECHACHES(正确);
连接();
InputStream is=conn.getInputStream();
BufferedInputStream bis=新的BufferedInputStream(is);
bm=BitmapFactory.decodeStream(bis);
二、关闭();
is.close();
}捕获(IOE异常){
e、 printStackTrace();
}
如果(bm==null){
返回null;
}
返回bm;
}
受保护的void onPostExecute(位图bmp){
如果(bmp==null){
返回;
}
cacheBitmap(url,bmp);
setImageBitmap(bmp);
}
}.execute();
}否则{
setImageBitmap(位图);
}
}
为什么异步任务要阻止与列表填充有关的任何内容?您正在启动多个异步任务吗?我将实现它,只使用1个加载所有图像的异步任务。为每个映像分配和启动新线程将花费大量时间
会让你开始的。但是,一定要考虑ListView在滚动时是如何重用视图的。您并不总是有一个简单的1视图对1位图对。每个应用程序可以运行多少异步任务是否有限制?是的。操作系统对线程有限制,而且最终会耗尽内存。嗯!谢谢而且,由于蜂巢,他们将并行异步任务限制为1。。。废话。。。那他妈的有什么用!是的,4个月前我也有同样的想法,但正确的方法是只创建一个背景线程。要做到这一点其实很复杂。