如何在Android中ListView中懒惰加载图片

48 浏览
0 Comments

如何在Android中ListView中懒惰加载图片

我正在使用 ListView 来显示一些图片和与这些图片相关的标题。我从互联网上获取这些图片。是否有一种方法来懒加载图片,以便在文本显示时,UI 不会被阻塞,并且在下载时显示下载的图片?

图片数量不是固定的。

admin 更改状态以发布 2023年5月19日
0
0 Comments

我在GitHub上创建了一个带有图像的简单的懒加载演示。

基本用法

ImageLoader imageLoader=new ImageLoader(context); ...
imageLoader.DisplayImage(url, imageView); 

不要忘记将以下权限添加到你的AndroidManifest.xml文件中:

 
  Please

只需创建一个ImageLoader实例并在整个应用程序中重复使用它。这样,图像缓存将更加高效。

这可能对某些人有帮助。它在后台线程中下载图像。图像在SD卡和内存中缓存。缓存实现非常简单,仅够用于演示。我使用inSampleSize解码图像以减少内存消耗。我还尝试正确处理回收的视图。

Alt text

0
0 Comments

这里是我创建的用于存储我的应用程序当前显示的图片的内容。请注意,这里使用的“Log”对象是我在Android中最终Log类的自定义包装器。 \n

package com.wilson.android.library;
/*
 Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
*/
import java.io.IOException;
public class DrawableManager {
    private final Map drawableMap;
    public DrawableManager() {
        drawableMap = new HashMap();
    }
    public Drawable fetchDrawable(String urlString) {
        if (drawableMap.containsKey(urlString)) {
            return drawableMap.get(urlString);
        }
        Log.d(this.getClass().getSimpleName(), "image url:" + urlString);
        try {
            InputStream is = fetch(urlString);
            Drawable drawable = Drawable.createFromStream(is, "src");
            if (drawable != null) {
                drawableMap.put(urlString, drawable);
                Log.d(this.getClass().getSimpleName(), "got a thumbnail drawable: " + drawable.getBounds() + ", "
                        + drawable.getIntrinsicHeight() + "," + drawable.getIntrinsicWidth() + ", "
                        + drawable.getMinimumHeight() + "," + drawable.getMinimumWidth());
            } else {
              Log.w(this.getClass().getSimpleName(), "could not get thumbnail");
            }
            return drawable;
        } catch (MalformedURLException e) {
            Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
            return null;
        } catch (IOException e) {
            Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
            return null;
        }
    }
    public void fetchDrawableOnThread(final String urlString, final ImageView imageView) {
        if (drawableMap.containsKey(urlString)) {
            imageView.setImageDrawable(drawableMap.get(urlString));
        }
        final Handler handler = new Handler(Looper.getMainLooper()) {
            @Override
            public void handleMessage(Message message) {
                imageView.setImageDrawable((Drawable) message.obj);
            }
        };
        Thread thread = new Thread() {
            @Override
            public void run() {
                //TODO : set imageView to a "pending" image
                Drawable drawable = fetchDrawable(urlString);
                Message message = handler.obtainMessage(1, drawable);
                handler.sendMessage(message);
            }
        };
        thread.start();
    }
    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();
    }
}

0