Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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的ViewHolder模式中使用SoftReference_Android_Tags_Android Viewholder - Fatal编程技术网

在android的ViewHolder模式中使用SoftReference

在android的ViewHolder模式中使用SoftReference,android,tags,android-viewholder,Android,Tags,Android Viewholder,我对软参考和软参考的东西还不熟悉。我正在制作一个通用的ViewHolder模式,该模式使Hashtable中的所有视图都由视图的Id键控。我决定对Hashtable使用SoftReference,对Hashtable中的项值也使用SoftReference。这是我的ViewHolder类 public class ListItemTagHolder { private int index; private SoftReference<java.util.Hashtable&

我对软参考和软参考的东西还不熟悉。我正在制作一个通用的
ViewHolder
模式,该模式使
Hashtable
中的所有视图都由视图的Id键控。我决定对Hashtable使用SoftReference,对Hashtable中的项值也使用SoftReference。这是我的ViewHolder类

public class ListItemTagHolder {
    private int index;
    private SoftReference<java.util.Hashtable<Integer,SoftReference<View>>> views=
            new SoftReference<java.util.Hashtable<Integer,SoftReference<View>>>(
                    new java.util.Hashtable<Integer,SoftReference<View>>());

    public ListItemTagHolder(int index){
        this.index=index;
    }

    public void destroy(){
        java.util.Hashtable<Integer,SoftReference<View>> vals=views.get();
        Enumeration<Integer> ks=vals.keys();
        while(ks.hasMoreElements()){
            vals.get(ks.nextElement()).clear();
        }
        vals.clear();
        views.get().clear();        
        views.clear();
        ks=null;
        vals=null;
    }

    public View getView(int id){
        return views.get().get(id).get();
    }

    public void addView(View v){
        views.get().put(v.getId(),new SoftReference<View>(v));
    }

    public int getIndex(){
        return index;
    }

    public void setIndex(int index){
        this.index=index;
    }
}
公共类ListItemTagHolder{
私有整数索引;
私人软件参考视图=
新软参考(
新的java.util.Hashtable();
公共ListItemTagHolder(整数索引){
这个。索引=索引;
}
公共空间销毁(){
java.util.Hashtable vals=views.get();
枚举ks=vals.keys();
而(ks.hasMoreElements()){
get(ks.nextElement()).clear();
}
vals.clear();
view.get().clear();
视图。清除();
ks=null;
VAL=null;
}
公共视图getView(内部id){
返回视图.get().get(id.get();
}
公共无效添加视图(视图v){
views.get().put(v.getId(),newsoftreference(v));
}
public int getIndex(){
收益指数;
}
公共void集合索引(int索引){
这个。索引=索引;
}
}
我想知道以下几点

  • 它是否正确使用SoftReference

  • 如果我的活动被破坏,而我无法 调用
    destroy()
    方法的
    ListItemTagHolder
    。记忆会消失吗 清理哈希表

  • 哈希表中的所有项是否每次都对我可用 除非删除对ListItemTagHolder的所有引用


  • 制作这种通用的视窗支架真的有回报吗?我想你知道VH的用途和使用频率吗?你不应该在ViewHolder模式中使用强引用以外的任何东西。ViewHolder模式旨在加快适配器中视图的填充速度。通过对视图持有者使用某种弱引用,只会减慢速度,因为它们比强引用更昂贵。其次,您对散列表被破坏的关注不应该是应用程序生命周期,而应该是运行时本身,例如Dalvik。Strong以外的引用受运行时支配,因此您不能依赖它们在内存中。@nyarlathotep77它不用于“填充视图”,而是用于访问它们,它取代了FindViewByDiges,为什么要使用findViewById?要获取对一个小部件的引用,您要做的事情通常是用您的数据填充:)@pskink我知道为什么要使用ViewHolder。我的应用程序有大约10-12个不同的活动,其中包含列表视图。每个ListView都有不同类型的数据和布局。这就是为什么我没有创建10-12个不同的ViewHolder或者在一个类中放置对所有可能控件的引用,而是创建了这种通用类型的东西。这对我帮助很大。