Refresh imageview in listview without blocking the UI (不阻塞用户界面刷新listview中的imageview)
Refresh imageview in listview without blocking the UI (不阻塞用户界面刷新listview中的imageview)
我正在使用ListView
来显示与图像相关联的一些图像和标题。我从互联网获取这些图像。是否有一种方法可以延迟加载图像,以便在文本显示时,UI不被阻塞,并且图像在下载时按需显示?
图像的总数量不是固定的。
admin 更改状态以发布 2023年5月24日
我做了一个带有图片的懒加载列表的简单演示(位于GitHub)。
基本用法
ImageLoader imageLoader=new ImageLoader(context); ... imageLoader.DisplayImage(url, imageView);
不要忘记在AndroidManifest.xml中添加以下权限:
Please
只创建一个ImageLoader实例,并在整个应用程序中重复使用它。这样图片缓存将变得更加高效。
这对某些人可能有所帮助。它在后台线程中下载图片。图片会在SD卡和内存中被缓存。缓存实现非常简单,仅适用于演示。我使用inSampleSize解码图像以减少内存消耗。我也尝试正确处理回收的视图。
这是我创建的用于容纳我应用程序当前显示的图像的内容。请注意,这里使用的“Log”对象是我在Android最终的Log类周围自定义包装器。
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(); } }