アプリケーションがメインスレッドで過剰な作業を行っている可能性があります。質問する

アプリケーションがメインスレッドで過剰な作業を行っている可能性があります。質問する

Android SDK/API 環境は初めてです。プロット/チャートを描画するのは初めてです。3 つの異なる無料ライブラリを使用して、エミュレーターでさまざまな種類のサンプル コードを実行してみましたが、レイアウト画面には何も表示されません。logcat は次のメッセージを繰り返し表示します。

W/Trace(1378): nativeGetEnabledTags からの予期しない値: 0
 I/Choreographer(1378): 55 フレームをスキップしました。アプリケーションがメイン スレッドで過剰な作業を実行している可能性があります。

ライセンスされたライブラリの評価版に関連するサンプル コードを実行すると、問題は解決し、チャートは機能しました。

ベストアンサー1

出典:Android UI : スキップされたフレームの修正

Android アプリケーションの開発を始めると、logcat で「Choreographer(abc): xx フレームをスキップしました。アプリケーションがメイン スレッドで過剰な作業を行っている可能性があります。」というこのメッセージを目にすることになります。では、これは実際には何を意味するのでしょうか。なぜ心配する必要があるのでしょうか。そして、どのように解決すればよいのでしょうか。

これは、コードの処理に時間がかかり、そのためにフレームがスキップされていることを意味します。これは、アプリケーションの中心で実行している重い処理や DB アクセス、またはスレッドがしばらく停止するその他の原因である可能性があります。

より詳しい説明は次のとおりです。

Choreographer を使用すると、アプリは vsync に接続し、適切なタイミングでパフォーマンスを向上させることができます。

Android ビュー アニメーションは、アニメーションのタイミングを適切に調整し、パフォーマンスを向上させるという同じ目的で、内部的に Choreographer を使用します。

Choreographer にはすべての vsync イベントが通知されるため、Choreographer.post* API によって渡された Runnable の 1 つが 1 フレームの時間内に終了せず、フレームがスキップされるかどうかを判断できます。

私の理解では、Choreographer はフレーム スキップを検出することしかできません。なぜこれが起こるのかを判別する方法はありません。

「アプリケーションがメインスレッドで過剰な作業を実行している可能性があります。」というメッセージは誤解を招く可能性があります。

ソース :Logcat の Choreographer メッセージの意味

なぜ心配する必要があるのか

このメッセージが Android エミュレーターに表示され、スキップされたフレームの数がかなり少ない (<100) 場合、エミュレーターが遅いと考えて間違いないでしょう。これはほぼ常に発生します。ただし、スキップされたフレームの数が多く、300 を超える場合は、コードに重大な問題がある可能性があります。Android デバイスには、iOS や Windows デバイスとは異なり、さまざまなハードウェアがあります。RAM と CPU はさまざまであり、すべてのデバイスで適切なパフォーマンスとユーザー エクスペリエンスが必要な場合は、この問題を修正する必要があります。フレームがスキップされると、UI が遅くなり、ラグが発生します。これは、望ましいユーザー エクスペリエンスではありません。

修正方法

これを修正するには、長時間の処理が発生している、または発生する可能性があるノードを特定する必要があります。最善の方法は、処理の大小に関係なく、すべての処理をメインのUIスレッドとは別のスレッドで実行することです。SQLiteデータベースからデータにアクセスする場合でも、ハードコアな計算を実行する場合でも、配列を単純に並べ替える場合でも、別のスレッドで実行します。

ここで注意すべき点があります。これらの操作を行うために新しいスレッドを作成し、アプリケーションを実行すると、「ビュー階層を作成した元のスレッドのみがビューにアクセスできます」というメッセージが表示されてクラッシュします。Android の UI はメイン スレッドまたは UI スレッドのみで変更できるということを知っておく必要があります。他のスレッドで変更しようとすると、このエラーで失敗してクラッシュします。必要なのは、runOnUiThread 内に新しい Runnable を作成し、この Runnable 内で UI に関連するすべての操作を実行することです。例をご覧ください。ここ

メイン スレッドの外でデータを処理するための Thread と Runnable がありますが、他に何があるでしょうか。Android には、UI スレッドで長時間の処理を実行できる AsyncTask があります。これは、アプリケーションがデータ駆動型または Web API 駆動型である場合、または Canvas を使用して構築されたような複雑な UI を使用する場合に最も便利です。AsyncTask の優れた点は、バックグラウンドで処理を実行できることです。処理が完了したら、遅延効果を引き起こすことなく、UI で必要なアクションを実行できます。これが可能なのは、AsyncTask が Activity の UI スレッドから派生しているためです。AsyncTask を介して UI で実行するすべての操作は、メイン UI スレッドとは別のスレッドで実行されるため、ユーザー操作が妨げられることはありません。

これが、スムーズな Android アプリケーションを作成するために知っておくべきことであり、私の知る限り、すべての初心者はコンソールにこのメッセージを受け取ります。

おすすめ記事