あなたがメインスレッドで(複雑なUIのレンダリングを含む)データの重い負荷を処理している場合は、logcatでメッセージのこの種を見つけることができます。
W/Trace(1274): Unexpected value from nativeGetEnabledTags: 0
I/Choreographer(1274): Skipped 55 frames! The application may be doing too much work on its main thread.
これが引き起こす可能性がスローダウンするようにアプリケーションを UIのレンダリングに関して
Suggestableは修正
これを修正するには、長い処理時間が発生する可能性のあるノードを特定する必要があります。最善の方法は、メインのUIスレッドとは別のスレッドでどれくらい小さくても大きくても、すべての処理を行うことです。したがって、データ形式SQLite Database
にアクセスするか、いくつかのハードコア数学を実行するか、単純に配列をソートする - 別のスレッドでそれを実行する
ここでキャッチがあります。これらの操作を実行するための新しいスレッドを作成し、 "ビュー階層を作成した元のスレッドのみがそのビューに触れることができる"というクラッシュが発生します。あなたは、アンドロイドのUIをメインスレッドまたはUIスレッドだけで変更できるというこの事実を知る必要があります。そうしようとする他のスレッドは、このエラーで失敗し、クラッシュします。あなたがする必要があるのは、Runnable
をrunOnUiThread
の中に新しく作成し、この実行可能ファイル内にUIを含むすべての操作を行う必要があります。 example hereを見つけます。
メインスレッドからデータを処理するためにThread
とRunnable
があります。アンドロイドにはAsyncTask
があり、UIスレッドで長時間の処理が可能です。これは、アプリケーションがデータ駆動型またはWeb API駆動型である場合、またはCanvasを使用したビルドのような複雑なUIを使用する場合に最も便利です。 AsyncTask
のパワーは、バックグラウンドでの処理を可能にし、処理が完了したら、ラグ効果を引き起こすことなくUIで必要なアクションを実行するだけです。これは、AsyncTask
がActivity
のUIスレッドから派生しているためです。AsyncTask
によってUI上で行うすべての操作は、メインUIスレッドとは異なるスレッドで行われます。ユーザーの操作に支障はありません。
これはスムーズなアンドロイドアプリケーションを作成するために知っておくべきことであり、すべての初心者がこのメッセージをコンソールで受け取ることを知っています。
onCreateView()、onActivityCreated()、およびonStart()は、ライフサイクルメソッド間でも呼び出されます。タイミングを合わせてみましたか?また、デバッガを使用して試してみて、長い時間がかかる特定のメソッド呼び出しがあるかどうか確認してください。 – arjabbar
'onCreate'と' onResume'は非同期で実行できるコードをたくさんしていますか?非常にネストされ複雑なレイアウトになっていますか?説明できない、または説明できないメモリグラフが爆発的に増加していますか?あなたの断片は、彼らが膨張されると同時に多くの仕事をしていますか?あなたはデータベース(オンライン、SQLite、Realmなど)に接続していますか? – Korcholis
うん、私はすべてのライフサイクルメソッドをbaseActivityとbaseFragmentを使って行った。ほとんどの場合、onViewCreatedが最も遅いです。私はすでにネストされたレイアウトを避けることによって、レイアウトの複雑さを減らそうとしました。データベース接続なし、アニメーションによるレイアウトの膨張のみ。 –