在android中更新ui线程的最佳方法

时间:2012-03-26 01:55:04

标签: android performance ui-thread

我有一个逐帧播放视频的应用程序。这一切都有效。然而,在调查性能问题和运行traceview时,我注意到有很多调用消息的调用,这使用了大量的cpu时间。

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

所以我的问题是,在没有经历如此多开销的情况下从工作线程更新ui的最佳方法是什么?

**注意,这个电话每秒约30次。

3 个答案:

答案 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线程足够的解脱来解决我的问题。