Android面接問題:パフォーマンスの最適化
2024 ワード
文書ディレクトリ
レイアウト最適化ペイント最適化メモリ最適化応答速度最適化スレッド最適化
レイアウトの最適化
核心思想:レイアウトの階層最適化方式を減らす:マルチネストの場合、RelativeLayoutを使用してネストを減らすことができます. レイアウトレベルが同じ場合はLinearLayoutを優先し、RelativeLayoutよりも効率的です. は、
ペイントの最適化(Paint Optimization)
核心思想:は、 は、時間のかかるタスクや大量のループ操作を回避します.
メモリの最適化
メモリ漏洩:プログラムはメモリを申請した後、メモリを解放することができなくて、発生したごみメモリオーバーフロー(OOM):メモリ申請のメモリがシステムの指定したメモリを上回って、メモリ漏洩が多すぎてメモリオーバーフローを招くことを指す
最適化方法:1.静的変数によるメモリ漏洩:詳細:非静的内部クラスの静的変数が外部クラスに保持され、外部のActivityが回収できない.静的内部クラスは外部クラスの参照をデフォルトで保持せず、内部クラスを静的内部クラスまたは独立に設定する.
2.シングル・インスタンス・モードによるメモリ漏洩:詳細:シングル・インスタンス・モードのthisはActivityから来ており、Activityの保有を招き、Activityが回収できない解決:パラメータ
4.Handlerによるメモリ漏洩:詳細:非静的内部クラスのHandlerは外部クラスActivityの参照を暗黙的に保持し、MessageはHandlerへの参照を保持し、参照関係はメッセージが処理されるまで保持され、Activityの回収解決を阻止する:静的内部クラス+WeakReference弱参照を使用し、外部クラスがライフサイクルを終了したときにメッセージキューを空にする.リファレンス
5.スレッドによるメモリリーク:詳細:AsyncTask/Runnableは匿名の内部クラスとして存在し、Activityへの参照は暗黙的に保持されます.解決:静的内部クラス、スレッド内弱参照
6.リソースがシャットダウンされていないためメモリが漏れる:詳細:例えばBroadcastReceiver、File、Cursor、IOフロー、Bitmapなどの解決:直ちにシャットダウンリソースを回収する
7.ListViewにおけるAdapterによるメモリリーク:詳細:キャッシュを使用しない
おうとうそくどさいてきかアプリケーションでは、時間のかかる操作を回避し、時間のかかるタスクをInentServiceに配置します. ページのホワイトスクリーンの問題を起動して、起動ページにstyleスタイルを設定してホワイトスクリーンの問題を防止することができて、同時に移行アニメーションを追加して、視覚効果を増加することができます. メインスレッドの時間のかかる操作を回避し、マルチスレッドをオンにします.
スレッド最適化スレッドプールを使用して、Thread の大量作成を回避
レイアウト最適化ペイント最適化メモリ最適化応答速度最適化スレッド最適化
レイアウトの最適化
核心思想:レイアウトの階層最適化方式を減らす:
を使用してレイアウト多重化を増加させ、
はレイアウト階層を減少させ、
は怠惰にロードされる.ペイントの最適化(Paint Optimization)
核心思想:
View.onDraw()
で大量の操作最適化方式を実行することを避ける:onDraw()
で複数回呼び出されて大量の一時オブジェクトが生成される可能性があり、メモリが多すぎ、システムが頻繁にgcを占有し、実行効率が低下するため、新しい局所オブジェクトの作成を回避する.メモリの最適化
メモリ漏洩:プログラムはメモリを申請した後、メモリを解放することができなくて、発生したごみメモリオーバーフロー(OOM):メモリ申請のメモリがシステムの指定したメモリを上回って、メモリ漏洩が多すぎてメモリオーバーフローを招くことを指す
最適化方法:1.静的変数によるメモリ漏洩:詳細:非静的内部クラスの静的変数が外部クラスに保持され、外部のActivityが回収できない.静的内部クラスは外部クラスの参照をデフォルトで保持せず、内部クラスを静的内部クラスまたは独立に設定する.
context.getApplicationContext()
の使用2.シングル・インスタンス・モードによるメモリ漏洩:詳細:シングル・インスタンス・モードのthisはActivityから来ており、Activityの保有を招き、Activityが回収できない解決:パラメータ
context.getApplicationContext()
3.属性アニメーションによるメモリリーク:詳細:onDestroy()
で属性アニメーションを停止していないため、ViewはActivity解決を持っている:onDestroy()
でアニメーションを停止する4.Handlerによるメモリ漏洩:詳細:非静的内部クラスのHandlerは外部クラスActivityの参照を暗黙的に保持し、MessageはHandlerへの参照を保持し、参照関係はメッセージが処理されるまで保持され、Activityの回収解決を阻止する:静的内部クラス+WeakReference弱参照を使用し、外部クラスがライフサイクルを終了したときにメッセージキューを空にする.リファレンス
5.スレッドによるメモリリーク:詳細:AsyncTask/Runnableは匿名の内部クラスとして存在し、Activityへの参照は暗黙的に保持されます.解決:静的内部クラス、スレッド内弱参照
6.リソースがシャットダウンされていないためメモリが漏れる:詳細:例えばBroadcastReceiver、File、Cursor、IOフロー、Bitmapなどの解決:直ちにシャットダウンリソースを回収する
7.ListViewにおけるAdapterによるメモリリーク:詳細:キャッシュを使用しない
getView()
のみに依存するため、Item解決を毎回再初期化する必要がある:convertView多重化を使用するおうとうそくどさいてきか
スレッド最適化