Android 在ListView中懒散地加载图像
我遵循stackoverflow的回答: Github也提供了同样的服务: 在基本用法的最后一行,它说: 请仅创建ImageLoader的一个实例,并在所有地方重复使用它 你的申请。这样,图像缓存将更加高效 我该怎么做 我有很多ListView10-15,到目前为止,我在Adapter类中使用这种方式,如示例所示:Android 在ListView中懒散地加载图像,android,lazy-loading,Android,Lazy Loading,我遵循stackoverflow的回答: Github也提供了同样的服务: 在基本用法的最后一行,它说: 请仅创建ImageLoader的一个实例,并在所有地方重复使用它 你的申请。这样,图像缓存将更加高效 我该怎么做 我有很多ListView10-15,到目前为止,我在Adapter类中使用这种方式,如示例所示: public ImageLoader imageLoader; public LazyAdapter(Activity a, String[] d) {
public ImageLoader imageLoader;
public LazyAdapter(Activity a, String[] d) {
activity = a;
data=d;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageLoader=new ImageLoader(activity.getApplicationContext());
}
我试着这样做:
在第一个类中创建静态变量,并在其他任何地方使用它:
Class first{
public static ImageLoader imageLoader;
}
Class LazyAdapter{
first.imageLoader = new ImageLoader(activity.getApplicationContext());
//use it
}
但这不等于创建不同的实例吗?我的意思是,我将在每个适配器中创建一个新实例,当然前一个实例不会有更多的引用
那么,这是正确的使用方法吗
编辑:
这也写在代码中:
public File getFile(String url){
//I identify images by hashcode. Not a perfect solution, good for the demo.
String filename=String.valueOf(url.hashCode());
//Another possible solution (thanks to grantland)
//String filename = URLEncoder.encode(url);
File f = new File(cacheDir, filename);
return f;
}
那么,我应该使用字符串filename=URLEncoder.encodeurl
及
//使用可用堆大小的25%
堆大小是指RAM吗?或者可以分配给我读到的某个应用程序的最大RAM是19mb
因为根据设备三星Galaxy GT-S5830规范:
内部-158 MB存储,278 MB RAM
但在日志中我得到了
01-23 06:23:45.679: I/MemoryCache(1712): MemoryCache will use up to 16.0MB
这是代码中设置的25%
如果它大约占可用内存的25%。然后在设置->应用程序->管理应用程序中:
在底部,它说159MB使用21MB免费
谢谢作者提到在整个应用程序中只使用一个ImageLoader类的原因是创建ImageLoader类实例的次数与创建MemoryCache对象的次数相同,即创建ImageLoader实例的10倍,然后创建MemoryCache对象的10倍。在LazyList项目中,1个MemoryCache对象为图像保留1/4的应用程序堆内存。因此,在这里,由于有许多MemoryCache实例,大多数应用程序堆内存都已耗尽。这里我有一个解决您问题的方法,就是让MemoryCache类成为Singleton类,如下代码所示: 将MemoryCache中的构造函数更改为private,并进行以下修改
private static MemoryCache mc;
public static MemoryCache getMemoryCache()
{
if(mc==null)
{
mc = new MemoryCache();
}
return mc;
}
private MemoryCache(){
//use 25% of available heap size
setLimit(Runtime.getRuntime().maxMemory()/4);
}
作者提到,在整个应用程序中只使用一个ImageLoader类的原因是,创建ImageLoader类实例的次数与创建MemoryCache对象的次数相同,即创建ImageLoader实例的10倍,然后创建MemoryCache对象的10倍。在LazyList项目中,1个MemoryCache对象为图像保留1/4的应用程序堆内存。因此,在这里,由于有许多MemoryCache实例,大多数应用程序堆内存都已耗尽。这里我有一个解决您问题的方法,就是让MemoryCache类成为Singleton类,如下代码所示: 将MemoryCache中的构造函数更改为private,并进行以下修改
private static MemoryCache mc;
public static MemoryCache getMemoryCache()
{
if(mc==null)
{
mc = new MemoryCache();
}
return mc;
}
private MemoryCache(){
//use 25% of available heap size
setLimit(Runtime.getRuntime().maxMemory()/4);
}
您应该使用单例模式,或者只是在某个类中初始化一个静态变量,然后在任何地方使用它
public LazyAdapter(Activity a, String[] d) {
activity = a;
data=d;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageLoader= someClass.imageLoader;
}
您应该使用单例模式,或者只是在某个类中初始化一个静态变量,然后在任何地方使用它
public LazyAdapter(Activity a, String[] d) {
activity = a;
data=d;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageLoader= someClass.imageLoader;
}
为什么用户a不创建一个
在ImageLoader.java中尝试以下代码段:
为什么用户a不创建一个
在ImageLoader.java中尝试以下代码段:
你可以这样做:
public class ImageLoader {
private static ImageLoader inst;
private ImageLoader() {
}
public static ImageLoader getInstance() {
if (inst == null)
inst = new ImageLoader(Context);
return inst;
}
}
每当需要ImageLoader的对象时,只需调用getInstance方法:ImageLoader.getInstance您可以执行以下操作:
public class ImageLoader {
private static ImageLoader inst;
private ImageLoader() {
}
public static ImageLoader getInstance() {
if (inst == null)
inst = new ImageLoader(Context);
return inst;
}
}
无论何时需要ImageLoader的对象,只需调用getInstance方法:ImageLoader.getInstance您可以使用应用程序类保持静态ImageLoader,并且您可以通过getApplication.getImageLoader从任何活动访问它;有一个很好的库用于惰性背景图像加载,它具有单例逻辑和许多其他现成的特性。您可以使用应用程序类来保持静态ImageLoader,并且您可以通过getApplication.getImageLoader从任何活动访问它;有一个很好的库用于惰性背景图像加载,它具有单例逻辑和许多其他现成的特性。而不是memoryCache=新的memoryCache;使用memoryCache=memoryCache.getMemoryCache;在ImageLoader构造函数中???另外,请检查question@user1537779你在第一条评论中提到的是正确的。对于编辑问题,我可以说任何android设备的最小堆内存都是16MB,您可以使用一些最新的设备,以便显示16MB用于图像的内存。有些设备有16MB、32MB、64MB甚至128MB的堆内存;使用memoryCache=memoryCache.getMemoryCache;在ImageLoader构造函数中???另外,请检查question@user1537779你在第一条评论中提到的是正确的。对于编辑问题,我可以说任何android设备的最小堆内存都是16MB,您可以使用一些最新的设备,以便显示16MB用于图像的内存。有些设备具有16MB、32MB、64MB甚至128MB的堆内存
zed它将被同步Dear在添加“已同步”后,它将被同步