1

我有一个逐帧播放视频的应用程序。这一切都在工作。但是查看性能问题并运行 traceview 我注意到有很多调用发送消息,这使用了大量的 cpu 时间。

当我查看我的应用程序时,我正在使用处理程序向 ui 发布回调以显示当前帧号。当我删除它时,traceview 中的所有 dispatchMessage 调用都消失了。

所以我的问题是,什么是从工作线程更新 ui 而不会经历这么多开销的最佳方法?

**注意,此呼叫大约每秒进行 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 回答