23

只是澄清一下,但在主线程上的 Android 活动中,如果我调用Looper.myLooper()vsLooper.getMainLooper()返回相同的引用,对吗?他们是一样的东西?我知道我通常不必调用这些,因为 Android 会处理这个问题,但我想知道从主线程调用它们时它们有何不同?

如果我从主线程调用

Looper.myLooper().quit();
// or
Looper.getMainLooper().quit();

它们都给出了相同的运行时异常,所以我假设它们是相同的参考:

引起:java.lang.RuntimeException:主线程不允许退出。

谁能确认?

4

3 回答 3

33

您在文档中对其进行了描述:

getMainLooper()

返回应用程序的主循环器,它位于应用程序的主线程中。

我的循环器()

返回与当前线程关联的 Looper 对象。如果调用线程未与 Looper 关联,则返回 null。

至于 getMainLooper() 是否有用,我可以向你保证它确实有用。如果您在后台线程上执行一些代码并希望在 UI 线程上执行代码,例如更新 UI,请使用以下代码:

new Handler(Looper.getMainLooper()).post(new Runnable() {
  // execute code that must be run on UI thread
});

当然,还有其他方法可以实现这一目标。

另一个用途是,如果你想检查当前执行的代码是否在 UI 线程上运行,例如你想抛出/断言:

boolean isUiThread = Looper.getMainLooper().getThread() == Thread.currentThread();

或者

boolean isUiThread = Looper.getMainLooper().isCurrentThread();
于 2015-12-16T21:51:24.053 回答
6

Looper.getMainLooper()是获取附加到活动主线程的 Looper 的便捷 API。当您想从后台线程执行主线程上的某些代码时,它很有用。

通常如下使用:

new Handler(Looper.getMainLooper()).post(task);

Looper.myLooper()是 api 让 looper 附加到当前线程

于 2015-12-16T21:37:12.833 回答
3

如果在 中调用这两个方法main thread,它们是同一个对象!您可以在和的源代码中找到ActivityThread.java答案。Looper.javaThreadLocal.java

于 2017-07-27T04:42:40.457 回答