全能開發工程師角度下的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/zh-hk/n/144514.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
YXQQ的頭像YXQQ
上一篇 2024-10-25 13:52
下一篇 2024-10-25 13:52

相關推薦

發表回復

登錄後才能評論