Android LayoutInflater は、単一のコントロールのレンダリング時間を監視します

レイアウトの最適化を行う場合、ターゲットを絞った最適化を行うために、レンダリング時間が比較的長いコントロールをレイアウト内に配置する必要がありますどうやってするの?これは、LayoutInflater の Factory2 の助けを借りて実現できます。

LayoutInflater.setFactory2() メソッドは、LayoutInflater.Factory2 を設定するために使用されます。これにより、レイアウトファイルの解析時にLayoutInflater がビューを作成するプロセスをインターセプトして変更できます。Factory2 を設定すると、ビューのプロパティの変更やビュー タイプの置換など、作成したビューをカスタマイズできます。

package android.view;

public abstract class LayoutInflater {
    // ...

    public final View tryCreateView(View parent, String name, Context context, AttributeSet attrs) {
        View view;
        if (mFactory2 != null) { // 若 mFactory2 不为空,则回调
            view = mFactory2.onCreateView(parent, name, context, attrs);
        } else {
            view = null;
        }

        // ...
        return view;
    }

    // ...
}

 各コントロールの作成時に、Factory2 が空でない場合はコールバックが実行されます。


 使用:

public class MainActivity extends AppCompatActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        getLayoutInflater().setFactory2(new LayoutInflater.Factory2() {
            @Override
            public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
                long time = System.currentTimeMillis();
                View view = getDelegate().createView(parent, name, context, attrs);
                Log.i("kang", name + " 耗时:" + (System.currentTimeMillis() - time));
                return view;
            }

            @Override
            public View onCreateView(String name, Context context, AttributeSet attrs) {
                return null;
            }
        });

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

setFactory2() メソッドを呼び出してカスタム Factory2 インスタンスを渡すことにより、LayoutInflater がビュー オブジェクトを作成するプロセスをインターセプトして変更できます。インターセプト後は、ビューの外観、動作、プロパティを動的に変更するなど、必要な操作を行うことができます。


中心となるアイデアは、単一の View のレンダリングの前後の時間差を計算して、単一のコントロールレンダリング時間を知ることができるということです。単一のビューのレンダリング時間を知ることで、時間のかかる単一のコントロールを最適化できます。

このモニターの設定はsetContentView() よりも前に呼び出す必要があることに注意してください(すべてのレンダリングが終了すると、モニターの設定は確実に無効になるため)

おすすめ

転載: blog.csdn.net/weixin_47592544/article/details/131204216