2012-01-19 10 views
2

私はJsoupを使ってhtmlページをいくつか取得して解析し、htmlツリーを操作してから、それを描画するWebViewに渡します。私の操作を迂回すると、Android SDKシミュレータでコードが許容時間(2〜3秒)で実行されますが、私が操作すると、時間が許容できなくなります(約60秒で1ページを読み込みます)。Android SDKプロファイルのトレースビューを理解する方法...?

EclipseとAndroid SDKを使用してプロファイルを実行しましたが、今は結果を解釈しようとしています。ここからhttp://android-developers.blogspot.com/2010/10/traceview-war-story.htmlは「Exclusive Cpu Time%」のプロファイルをソートするためのヒントを得ました。私の驚いたことに、自分のコードは1%でもリストされていませんでした。最大の消費者は、11.9%のandroid.view.ViewGroup.drawChild()です。リストされていない最初のアンドロイド関数(排他的なcpu%でソートされたもの)はjava.lang.ref.Reference.get()であり、0.4%でリストされています。

しかし私は、私のコードのそれは私のAsyncTaskのdoInBackground()しかリストされていないことが分かりました。デバッグ出力によって呼び出されたことがわかっていても、この関数が順番に呼び出す関数は存在しません。なぜそれらはリストに載っていないのですか?

私はこのことをどうするか分かりません。ヒントは非常に高く評価されています。

+0

誰かが興味を持っているのなら... AsyncTaskは私のコードではなく、ここの犯人です。 TraceViewウィンドウでは、私の仕事は非常にまれに実行されていることに気付きました。これは、10ミリ秒のチャンクで約4回/秒です!スレッドの優先順位はデフォルトで5でしたが、スレッドに設定しました。MAX_PRIORITYになりました。これで、前回の60秒以上ではなく、10秒間の受け入れ可能なローディング時間に近づきました。今私はそれが私であるか、これがうまくいく方法であるのだろうか? – OppfinnarJocke

答えて

2

私が手に基準を持っていませんが、私は優先順位のスレッドで)それはAndroidはAsyncTask.doInBackgroundを(実行と仮定しても安全だと思うandroid.os.Process.THREAD_PRIORITY_BACKGROUND

これは、このスレッドを意味し、常にまたは頻繁な状況の下で、私は確信していないし、様々な主張を読んでいるLinux cgroup(スケジューリングクラス)のコンテキストでスケジュールされています - 共通CPU時間の上限は5%または10%再び、さまざまな情報源が異なる主張をする - 適用されます。

つまり、すべてのバックグラウンドスレッドは、使用可能なCPU時間の5%または10%を共有する必要があります。フォアグラウンドとリアルタイムのタスクがアイドル状態であれば、これが動的に調整されているとの主張を読んだことがありますが、信頼できるソースを自分自身に指摘できてうれしいです。また、ユーザーが自分のアプリを使用している間、リアルタイムのオーディオストリームを聴くことができるので、私はそれを期待しません。

あなたがバックグラウンドスレッドの優先順位を調整した場合は、そのよう:

private static final int bgThreadPrio = Process.THREAD_PRIORITY_BACKGROUND + 
             Process.THREAD_PRIORITY_MORE_FAVORABLE; 
protected YourReturnType doInBackground() { 
    Process.setThreadPriority(bgThreadPrio); 
    .... 
} 

、あなたは二つのことを実現します。

  • あなたはそれが(Androidは、この点でその方針を変えるまで、少なくとも現在は)他のバックグラウンドスレッドでCPU時間の10%を共有する必要がないように、背景のcgroupの外にスレッドを持ち上げます。
  • THREAD_PRIORITY_DEFAULTが0であり、THREAD_PRIORITY_BACKGROUNDが10であるため、通常はユーザインタフェースとリアルタイムスレッドに非常に悪影響を与えないスレッドに優先度を割り当てます。したがって、スレッドは優先度9で実行され、0よりもはるかに悪くなりますバックグラウンドタスクの人為的な制限を回避します。

しかし、おそらく、基礎となるAsyncTaskエグゼキュータがあなたのAsyncTaskに提供するスレッドの優先度も変更するでしょう。このスレッドはリサイクルされ、単一のスレッドでも、プールから選択されたスレッドでもかまいません。そのため、アプリ内のすべてのAsyncTaskのすべてのdoInBackground()メソッドで優先順位を設定することをお勧めします。

関連する問題