カスタム ビューのパフォーマンスのボトルネックを突破する

Android アプリケーションでは、カスタム ビューは非常に一般的な要件です。カスタム ビューは、アプリケーションの特定のニーズを満たす独自の UI 要素を作成するのに役立ちます。ただし、カスタム ビューは、特にアプリケーションが多数のカスタム ビューを処理する必要がある場合、パフォーマンスの問題を引き起こす可能性があります。

この記事では、カスタム ビューを処理するときにアプリケーションが効率的で安定した状態を維持できるようにするための、Android カスタム ビューのパフォーマンス最適化のヒントをいくつか紹介します。以下の観点から議論していきます。

1. 正しいレイアウトを使用する

カスタム ビューを作成する場合は、適切なレイアウトが重要です。正しいレイアウトを使用すると、レイアウト階層を最小限に抑えることができ、アプリケーションのパフォーマンスを向上させることができます。

たとえば、複数のサブビューを含むカスタム ビューを作成する必要がある場合、RelativeLayout および LinearLayout の代わりに ConstraintLayout を使用すると、レイアウトが簡素化され、ネストが削減されます。

サンプルコードは次のとおりです。

<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- 添加您的自定义视图组件和约束条件 -->

</androidx.constraintlayout.widget.ConstraintLayout>

もう 1 つの重要なレイアウト トリックは、ViewStub を使用することです。ViewStub は、プレースホルダーとして使用できる軽量のビューであり、実際のビューが必要になるまで拡張されません。これにより、レイアウト階層が大幅に削減され、パフォーマンスが向上します。

2. キャッシュビュー

ビューのキャッシュは、パフォーマンス最適化のもう 1 つの重要なヒントです。カスタム ビューを使用する場合、通常は複数のインスタンスを作成する必要があります。これらのインスタンスを適切にキャッシュしないと、アプリケーションが非常に遅くなる可能性があります。

ビューをキャッシュするには、Android の ViewHolder パターンを使用するか、カスタム キャッシュ オブジェクトを使用します。ViewHolder パターンは、リスト ビューまたはグリッド ビューのパフォーマンスを向上させるために Android 開発者によって広く使用されている手法です。カスタム キャッシュ オブジェクトを使用すると、ビューのライフサイクルをより詳細に制御できるようになり、ビューの作成と破棄が減ります。

以下は ViewHolder パターンのサンプル コードです。

class CustomView(context: Context) : View(context) {
    
    
    private class ViewHolder {
    
    
        // 缓存视图
        var textView: TextView? = null
        var imageView: ImageView? = null
        // 添加其他视图组件
    }

    private var viewHolder: ViewHolder? = null

    init {
    
    
        // 初始化ViewHolder
        viewHolder = ViewHolder()
        // 查找视图并关联到ViewHolder
        viewHolder?.textView = findViewById(R.id.text_view)
        viewHolder?.imageView = findViewById(R.id.image_view)
        // 添加其他视图组件的查找和关联
    }

    override fun onDraw(canvas: Canvas) {
    
    
        super.onDraw(canvas)
        // 绘制视图
    }
}

3. 過度な描画操作を避ける

描画操作は、カスタム ビューのパフォーマンスに関する最も重要な問題の 1 つです。カスタム ビューで多くの描画操作が必要な場合、アプリケーションの速度が非常に遅くなる可能性があります。

過剰な描画操作を避けるために、View の setWillNotDraw メソッドを使用して不要な描画を無効にすることができます。Canvas の ClipRect メソッドを使用して、描画操作の領域を制限することもできます。さらに、ハードウェア アクセラレーションを使用して描画操作を高速化できます。

サンプルコードは次のとおりです。

class CustomView(context: Context) : View(context) {
    
    
    init {
    
    
        setWillNotDraw(true) // 禁用绘制
    }

    override fun onDraw(canvas: Canvas) {
    
    
        super.onDraw(canvas)
        // 绘制操作
        canvas.clipRect(0, 0, width, height) // 限制绘制区域
        // 添加其他绘制操作
    }
}

4. 非同期タスクの使用

カスタム ビューで、ネットワークからの画像の読み込みや大量のデータの処理など、時間のかかる操作を実行する必要がある場合は、非同期タスクを使用してこれらの操作を実行する必要があります。これにより、アプリケーションの応答性が維持され、これらの操作の実行中に UI がブロックされなくなります。

非同期タスクを使用して画像をロードするサンプル コードを次に示します。

class CustomView(context: Context) : View(context) {
    
    
    private var image: Bitmap? = null

    fun loadImageAsync(imageUrl: String) {
    
    
        val asyncTask = object : AsyncTask<Void, Void, Bitmap>() {
    
    
            override fun doInBackground(vararg params: Void?): Bitmap {
    
    
                // 执行耗时操作,如从网络加载图像
                return loadImageFromUrl(imageUrl)
            }

            override fun onPostExecute(result: Bitmap) {
    
    
                super.onPostExecute(result)
                // 在主线程更新UI
                image = result
                invalidate() // 刷新视图
            }
        }

        asyncTask.execute()
    }

    override fun onDraw(canvas: Canvas) {
    
    
        super.onDraw(canvas)
        // 绘制图像
        image?.let {
    
    
            canvas.drawBitmap(it, 0f, 0f, null)
        }
        // 添加其他绘制操作
    }
}

5. 適切なデータ構造を使用する

カスタム ビューでは、適切なデータ構造を使用すると、パフォーマンスが大幅に向上します。たとえば、多数の点または線を描画する必要がある場合、FloatBuffer または ByteBuffer を使用するとパフォーマンスが向上します。大量の画像データを処理する必要がある場合は、BitmapFactory.Options を使用するとメモリ使用量を削減できます。

以下は、FloatBuffer を使用して点を描画するサンプル コードです。

class CustomView(context: Context) : View(context) {
    
    
    private var pointBuffer: FloatBuffer? = null

    init {
    
    
        // 初始化点的数据
        val points = floatArrayOf(0f, 0f, 100f, 100f, 200f, 200f)
        pointBuffer = ByteBuffer.allocateDirect(points.size * 4)
            .order(ByteOrder.nativeOrder())
            .asFloatBuffer()
        pointBuffer?.put(points)
        pointBuffer?.position(0)
    }

    override fun onDraw(canvas: Canvas) {
    
    
        super.onDraw(canvas)
        // 绘制点
        pointBuffer?.let {
    
    
            canvas.drawPoints(it, paint)
        }
        // 添加其他绘制操作
    }
}

結論は

この記事では、Android カスタム ビューのパフォーマンス最適化テクニックをいくつか検討しました。適切なレイアウト、ビューのキャッシュ、過剰な描画操作の回避、非同期タスクの使用、および適切なデータ構造を使用することで、カスタム ビューを処理する際にアプリケーションの効率と安定性を確保できます。

カスタム ビューのパフォーマンスの最適化は継続的なプロセスであることに注意してください。アプリケーションを頻繁に見直し、最新のテクノロジーとベスト プラクティスを使用してパフォーマンスを向上させる必要があります。

やっと

アーキテクトになりたい場合、または 20,000 ~ 30,000 の給与範囲を突破したい場合は、コーディングとビジネスに限定されず、モデルを選択し、拡張し、プログラミング的思考を向上させることができなければなりません。また、しっかりとしたキャリアプランも大切で、学ぶ習慣も大切ですが、一番大切なのは継続力であり、継続的に実行できないプランは絵にかいたもちです。

方向性がわからない場合は、Ali のシニア アーキテクトが書いた一連の「Android の 8 つの主要モジュールに関する上級ノート」をここで共有したいと思います。これは、乱雑で散在し断片化した知識を体系的に整理するのに役立ちます。 Android開発のさまざまな知識を体系的かつ効率的に習得できます。
ここに画像の説明を挿入
私たちが普段読んでいる断片的な内容と比べて、このノートの知識ポイントはより体系的で理解しやすく、覚えやすく、知識体系に従って厳密に配置されています。

ビデオ素材のフルセット:

1. インタビュー集

ここに画像の説明を挿入
2. ソースコード解析集
ここに画像の説明を挿入

3. オープン ソース フレームワークのコレクションは、
ここに画像の説明を挿入
ワン クリックと 3 つのリンクで誰でもサポートできるようになっています。記事内の情報が必要な場合は、記事の最後にある CSDN 公式認定 WeChat カードを直接スキャンして無料で入手してください↓↓↓

PS: グループには ChatGPT ロボットもおり、仕事や技術的な質問に答えることができます。

おすすめ

転載: blog.csdn.net/weixin_43440181/article/details/131089695