我有一个逐帧播放视频的应用程序。这一切都有效。然而,在调查性能问题和运行traceview时,我注意到有很多调用消息的调用,这使用了大量的cpu时间。
当我查看我的应用程序时,我正在使用处理程序将回调发布到ui以显示当前帧编号。当我删除了这个时,traceview中的所有dispatchMessage调用都消失了。
所以我的问题是,在没有经历如此多开销的情况下从工作线程更新ui的最佳方法是什么?
**注意,这个电话每秒约30次。
答案 0 :(得分: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);
}
}
答案 1 :(得分: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)
希望它有所帮助。
答案 2 :(得分:0)
根据需要,所述资源很好。在我的情况下,它是ui线程上发生的一些小事情的结果,主要是一些简单的转换。我把所有这些都移到我的后台线程中,所以我正在绘制一个预先变换的位图。这给了ui线程足够的解脱来解决我的问题。