Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在ListView中懒散地加载图像_Android_Lazy Loading - Fatal编程技术网

Android 在ListView中懒散地加载图像

Android 在ListView中懒散地加载图像,android,lazy-loading,Android,Lazy Loading,我遵循stackoverflow的回答: Github也提供了同样的服务: 在基本用法的最后一行,它说: 请仅创建ImageLoader的一个实例,并在所有地方重复使用它 你的申请。这样,图像缓存将更加高效 我该怎么做 我有很多ListView10-15,到目前为止,我在Adapter类中使用这种方式,如示例所示: public ImageLoader imageLoader; public LazyAdapter(Activity a, String[] d) {

我遵循stackoverflow的回答:

Github也提供了同样的服务:

在基本用法的最后一行,它说:

请仅创建ImageLoader的一个实例,并在所有地方重复使用它 你的申请。这样,图像缓存将更加高效

我该怎么做

我有很多ListView10-15,到目前为止,我在Adapter类中使用这种方式,如示例所示:

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在添加“已同步”后,它将被同步