我有一个逐帧播放视频的应用程序。这一切都在工作。但是查看性能问题并运行 traceview 我注意到有很多调用发送消息,这使用了大量的 cpu 时间。
当我查看我的应用程序时,我正在使用处理程序向 ui 发布回调以显示当前帧号。当我删除它时,traceview 中的所有 dispatchMessage 调用都消失了。
所以我的问题是,什么是从工作线程更新 ui 而不会经历这么多开销的最佳方法?
**注意,此呼叫大约每秒进行 30 次。
我有一个逐帧播放视频的应用程序。这一切都在工作。但是查看性能问题并运行 traceview 我注意到有很多调用发送消息,这使用了大量的 cpu 时间。
当我查看我的应用程序时,我正在使用处理程序向 ui 发布回调以显示当前帧号。当我删除它时,traceview 中的所有 dispatchMessage 调用都消失了。
所以我的问题是,什么是从工作线程更新 ui 而不会经历这么多开销的最佳方法?
**注意,此呼叫大约每秒进行 30 次。
// 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);
}
}
我对你的实现并不完全清楚,但你可以试试这些。如果您通过处理程序更新视图,您可以在视图本身上使用它来从不同的线程更新它。
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 )
希望能帮助到你。
根据需要,可以很好地使用所述资源。就我而言,这是 ui 线程上发生的一些小事情的结果,主要是一些简单的转换。我将所有这些都移到了我的后台线程中,所以我正在绘制一个预先转换的位图。这给了 ui 线程足够的缓解来解决我的问题。