7

我一直在搞乱 runOnUiThread 方法。如果我只是在我的活动中创建一个方法:

public void Test()
{
    runOnUiThread(new Runnable() 
    {
        public void run() 
        {
            Log.v("mainActivity", "test");
        }
    });     
}

我注意到这个可运行文件只运行一次。但是,这不是问题。我想知道的是,我是否完全错过了某些东西,并且它在后台执行了一些操作,当我执行该方法几次时会导致帧速率下降。

4

2 回答 2

15

这是Activity.runOnUiThread(Runnable)的全部内容:

public final void runOnUiThread(Runnable action) {
    if (Thread.currentThread() != mUiThread) {
        mHandler.post(action);
    } else {
        action.run();
    }
}

方法体仍然在你的后台线程中执行,并且android.os.Handler类的 mHandler为发布到它的 Runnables 实现了一个内部队列,所以除非你在 Runnable 中做阻塞工作(这是一个很大的禁忌UI 线程)或在短时间内调用此方法超过一千次,您应该看不到任何区别。

现在,如果您正在调用Handler.postAtFrontOfQueue(Runnable),那么就会出现问题,因为您的 Runnable 本质上是“排队”。在这种情况下,这可能会导致卡顿,因为您的 Runnable 正在执行,而不是任何需要发生的 UI 更新(如滚动)。

请注意,您只需要在 UI 线程上运行 UI 更新,例如调用视图上的任何方法(因此名称为“UI 线程”以及此方法存在的原因)或文档明确声明需要在其上运行的任何操作用户界面线程。否则,如果您已经在后台线程上,则没有真正的理由离开它。

于 2013-05-07T04:31:16.937 回答
1

它不太可能对您的 UI 进程造成任何重大中断,但是在 UI 线程上运行它确实没有意义。

如果你正在做大量的工作,你应该确保你不在 UI 线程上做。

于 2013-05-07T04:21:38.760 回答