全能开发工程师角度下的Javaholder

一、优势

Javaholder是一个非常方便的工具类,可以大大简化代码,提高开发效率。具体来说,它有以下几个优势:

1、方便快捷的ViewHolder创建

// 使用javaholder
public class MyAdapter extends RecyclerView.Adapter {
    ...
    public static class ViewHolder extends Javaholder {
        TextView textView;
        ImageView imageView;

        public ViewHolder(View itemView) {
            super(itemView);
            textView = $(R.id.textview);
            imageView = $(R.id.imageview);
        }
    }
    ...
}

相比传统写法,使用Javaholder可以使ViewHolder创建部分清晰明了。ViewHolder的成员变量只需要通过$(int resourceId)即可找到view,无需再使用findViewById。接着就可以在任意位置调用ViewHolder的成员变量,完全不用关心Finder的问题。

2、可读性高的findViewById()替代方式

// 使用findViewById()
public class MyActivity extends Activity {
    private TextView textView;
    private Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.textview);
        button = (Button) findViewById(R.id.button);
        ...
    }
    ...
}
// 使用javaholder
public class MyActivity extends Activity {
    private Javaholder holder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        holder = new Javaholder(this, R.layout.activity_main);
        ...
    }
    ...
}

在Activity等类中,我们通常使用findViewById()来获取View对象。然而,在复杂的布局中,使用findViewById会使代码变得冗长。相比之下,Javaholder使用$()的方式更加优雅简便。

3、无差异的兼容性

Javaholder可以在所有API级别的Android系统上使用,没有兼容性问题。无论应用程序在哪种 Android 系统上运行,都可以使用Javaholder,无需修改代码。

二、实现

Javaholder本质上是一个反射的工具类。具体实现方式大致如下:

public abstract class Javaholder {  
    private SparseArray mViews = new SparseArray();  
    private View mConvertView;  
   
    public Javaholder(View convertView) {  
        mConvertView = convertView;
    }  
   
    public View getConvertView() {  
        return mConvertView;  
    }

    protected  T $(int resId) {  
        T view = (T) mViews.get(resId);  
        if (view == null) {  
            view = (T) mConvertView.findViewById(resId);  
            mViews.put(resId, view);  
        }  
        return view;  
    }  
} 

在Javaholder中,使用SparseArray来存储View对象。每当需要获取View对象时,先去SparseArray中查找,若为空则通过mConvertView.findViewById(resId)来查找,然后将该View对象存入SparseArray中。这样,在每次使用ViewHolder时,就可以直接调用ViewHolder的成员变量引用view,避免重复调用findViewById方法。

三、适用范围

Javaholder适用于所有需要使用到ViewHolder的Android应用程序。因为ViewHolder的使用基本上是Android应用程序的一个种规范。

四、使用建议

在使用Javaholder时,需要注意以下几点:

1、Javaholder适用于布局文件中View较多的情况。

因为反射查找方式需要消耗额外的时间,在布局文件中View较少的情况下不推荐使用。

2、尽量避免在for循环中调用findViewById。

在适配器中使用ViewHolder时,需要避免在for语句中使用findViewById。尽管ViewHolder的优化可以避免不必要的findViewById调用,但在for语句中,还是会造成很大的性能开销。

3、尽量避免进行过多的反射操作。

反射是一项非常消耗性能的操作,在使用Javaholder时应尽量避免进行多次反射操作。

原创文章,作者:YXQQ,如若转载,请注明出处:https://www.506064.com/n/144514.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
YXQQYXQQ
上一篇 2024-10-25 13:52
下一篇 2024-10-25 13:52

相关推荐

发表回复

登录后才能评论