Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android异步图像url加载_Android_Android Listview_Android Asynctask - Fatal编程技术网

android异步图像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

我有一个自定义的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<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个月前我也有同样的想法,但正确的方法是只创建一个背景线程。要做到这一点其实很复杂。