0

我有一个自定义 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);
    }
}

为什么异步任务应该阻止与列表人口有关的任何事情?

4

1 回答 1

0

您是否正在启动多个 AsyncTasks?我会将它实现为仅使用 1 个加载所有图像的 AsyncTask。将花费大量时间为每个图像分配和启动新线程。

http://developer.android.com/training/displaying-bitmaps/process-bitmap.html将帮助您入门。但是请务必考虑诸如 ListView 在滚动时如何重用视图之类的问题。您并不总是有一个简单的 1 视图到 1 位图对。

于 2013-01-27T21:53:05.827 回答