如何在Android中ListView中懒惰加载图片
如何在Android中ListView中懒惰加载图片
我正在使用 ListView
来显示一些图片和与这些图片相关的标题。我从互联网上获取这些图片。是否有一种方法来懒加载图片,以便在文本显示时,UI 不会被阻塞,并且在下载时显示下载的图片?
图片数量不是固定的。
admin 更改状态以发布 2023年5月19日
我在GitHub上创建了一个带有图像的简单的懒加载演示。
基本用法
ImageLoader imageLoader=new ImageLoader(context); ... imageLoader.DisplayImage(url, imageView);
不要忘记将以下权限添加到你的AndroidManifest.xml文件中:
Please
只需创建一个ImageLoader实例并在整个应用程序中重复使用它。这样,图像缓存将更加高效。
这可能对某些人有帮助。它在后台线程中下载图像。图像在SD卡和内存中缓存。缓存实现非常简单,仅够用于演示。我使用inSampleSize解码图像以减少内存消耗。我还尝试正确处理回收的视图。
这里是我创建的用于存储我的应用程序当前显示的图片的内容。请注意,这里使用的“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 MapdrawableMap; 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(); } }