为什么在runOnUiThread使用Handler时也一样?

And*_*lva 53 multithreading android handler android-asynctask

我遇到过HandlerrunOnUiThread概念.但对我来说,它们似乎仍然存在疑问,因为它们确实存在哪些不同之处.

它们都旨在从后台线程执行UI操作.但是,当我们在两种方法中进行选择时,要考虑的因素是什么.

例如,考虑一个Runnable Thread在后台执行Web服务的人,现在我想更新UI.

更新我的UI的最佳方法是什么?我应该去Handler还是runOnUiThread

我仍然知道我可以使用AsyncTask并使用onPostExecute.但我只想知道其中的区别.

Hit*_*sit 75

Activity.runOnUiThread()是更通用的处理程序的特例.随着Handler你可以创建自己的线程中自己的事件查询.使用默认构造函数Handlers实例化并不意味着" 代码将在UI线程上运行 ".默认情况下,处理程序绑定到从中实例化的处理程序. Thread

要创建Handler保证绑定到UI(主)线程,您应该创建Handler绑定到Main Looper的对象, 如下所示:

Handler mHandler = new Handler(Looper.getMainLooper());
Run Code Online (Sandbox Code Playgroud)

而且,如果你检查runOnUiThread()方法的实现,它是Handler用来做的事情:

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

正如您从上面的代码片段中看到的那样Runnable action,如果runOnUiThread()从UI线程调用,将立即执行.否则,它会将其发布到Handler,稍后将在某个时间点执行.

  • @Mike,这完全取决于你的代码.通常是的,处理程序是从主线程实例化的,但是有很多情况下开发人员在创建`Handler`实例时没有关于当前线程的确切信息.因此,开发人员应该使用`new Handler(Looper.getMainLooper())`如果他需要处理程序将在主线程中执行的保证. (8认同)