Android - myLooper()vs getMainLooper()

时间:2015-12-16 21:31:34

标签: android android-looper

只是澄清但是在MAIN主题上的Android活动中,如果我调用Looper.myLooper() vs Looper.getMainLooper(),则返回相同的引用,对吧?他们是一样的东西?我知道我通常不会打电话给这些,因为Android负责这个,但我想知道从主线程调用时它们有何不同?

如果来自主线程我打电话

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

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

  

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

任何人都可以确认吗?

3 个答案:

答案 0 :(得分:18)

你在文档中描述了它:

getMainLooper()

  

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

myLooper()

  

返回与当前线程关联的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();

答案 1 :(得分:4)

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

通常使用如下:

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

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

答案 2 :(得分:2)

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