Android - myLooper() vs getMainLooper()



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

如果从主线程我调用

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

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

导致原因:java.lang.RuntimeException:不允许主线程退出。

有人能证实吗?

文档中对其进行了描述:

getMainLooper()

返回应用程序的主活套,该活套位于应用程序的主要线程中。

myLooper()

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

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

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

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

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

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

boolean isUiThread = Looper.getMainLooper().isCurrentThread();

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

它通常如下使用:

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

Looper.myLooper()是将活套连接到当前线程的api

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

相关内容

  • 没有找到相关文章

最新更新