1

フレームごとにビデオを再生するアプリケーションがあります。これはすべて機能しています。ただし、パフォーマンスの問題を調べてトレースビューを実行すると、メッセージをディスパッチするための呼び出しが多数あることに気付きました。これは多くの CPU 時間を使用していました。

アプリを見ると、現在のフレーム番号を表示するためにハンドラーを使用して ui にコールバックを送信しています。これを削除すると、traceview のすべての dispatchMessage 呼び出しがなくなりました。

だから私の質問は、それほど多くのオーバーヘッドを経験することなくワーカースレッドからUIを更新する最良の方法は何ですか?

**注: この呼び出しは 1 秒間に約 30 回行われます。

4

3 に答える 3

2
// declaration
BrightTimer brt;
Handler mHandler;
Runnable mUpdateResults;

// onCreate
mHandler = new Handler();
mUpdateResults = new Runnable() {
    public void run() {
        //  set value to the widget you wish to update when the thread is running
    }
};
int delay = 0; // delay for 1 sec.
int period = 60000; // repeat every 1 sec.

Timer timer = new Timer();

brt = new BrightTimer();
timer.scheduleAtFixedRate(brt, delay, period);

// TimerClass
public class BrightTimer extends TimerTask
{
    @Override
    public void run() {
        mHandler.post(mUpdateResults);
    }
}
于 2012-03-26T04:21:13.957 に答える
1

私はあなたの実装について完全に明確ではありませんが、これらを試すことができます. ハンドラーを介してビューを更新している場合は、ビュー自体でこれを使用して、別のスレッドから更新できます。

post() : http://developer.android.com/reference/android/view/View.html#post(java.lang.Runnable )

他に試すことができるのは、Activity クラスで利用可能な runOnUIThread() を使用することです。

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable )

それが役に立てば幸い。

于 2012-03-26T04:09:17.043 に答える
0

記載されているリソースは、ニーズに応じて適切にアプローチされています。私の場合、それはuiスレッドで起こったいくつかのマイナーなこと、主にいくつかの単純な変換の結果でした。これらすべてをバックグラウンドスレッドに移動したので、事前に変換されたビットマップを描画していました。これは私の問題を解決するためにUIスレッドに十分な救済を与えました。

于 2012-04-03T04:35:00.190 に答える