当前位置: 首页 > 知识库问答 >
问题:

了解Looper在Android中的内容

南宫云
2023-03-14

我不得不将Looper添加到以下代码中:

public class MyRunnable implements Runnable
{
  @Override
  public void run()
  {
      Looper.prepare();
      final Looper looper = Looper.myLooper();

      new Handler().postDelayed(
          new Runnable()
          {
            @Override
            public void run()
            {
              try
              {
              }
              catch (Exception ex)
              {
              }
              finally
              {
                looper.quit();
              }
            }
          }, 100);

      Looper.loop();
  }
}

注意,在runnable中有一个runnable。嵌套的runnable通过处理程序执行。最初我没有Looper,但Android抱怨我需要调用Looper。在执行另一个线程之前进行准备。

我读了Looper的书,但它看起来还是有点神秘。它看起来像某种内部消息传递管道。我不清楚为什么这是必要的,因为没有消息从我的外部可运行程序传到我的内部可运行程序。尽管这是真的,但Android似乎只是制定了一个硬性规则,如果你从一个线程调用一个线程,你必须也调用Looper.prepare。即使我照原样接受这一点,它仍然无助于理解为什么我需要调用looper.loop和looper.quit。如果我省略Looper.loop,我的处理程序永远不会运行,这就是不清楚的地方。Looper.loop做了什么来允许我的处理程序运行?

共有3个答案

祁晟
2023-03-14

我发现下面的教程对理解循环器的概念非常有帮助。
循环器和处理程序简介

裴华荣
2023-03-14

循环器的简单概念:

> < li>

您创建和运行的每个工作线程都会在执行完最后一个操作后结束。

为了防止线程终止,您可以通过调用 Looper.loop() 来启动循环,请将其视为 while(true){} 语句。在调用循环循环之前,你必须使用循环.prepare()准备循环,如果它还没有准备好的话。要终止循环并结束线程,您需要在循环器上调用循环器.quit()

现在,对于您从Android收到的通知:

当您在线程中创建处理程序时,它将绑定到创建它的线程,当您使用此处理程序发布可运行时,代码将在处理程序的线程上运行。

因此,当系统看到您希望在绑定到线程的处理程序上运行某些代码(特别是在将来的100ms)时,该线程将在调用完post方法后立即死亡,因此建议使用<code>Looper。loop()以防止该线程终止,从而使您能够在仍然存在的线程中正确运行第二个可运行线程。

巫马玉堂
2023-03-14

这是一篇关于此的精彩文章。

Android中的Looper和Handler

它附带了一个简单的模式,可以直接理解循环器和处理程序之间的关系。

在这个模式中,我们看到,在同一个线程(由大矩形表示)中,无论您创建多少个处理程序,它们都将使用同一个looper,即该线程的唯一Looper。

注:

必须准备好循环器以允许关联的处理程序处理已发布的消息。

Android应用程序,更确切地说,Android应用程序UI线程(主线程),已经配备了一个准备好的循环器(主循环器)。

下面是如何与UI线程通信。

 类似资料:
  • 似乎(至少是用)创建的looper不会被垃圾收集,即使其他代码没有引用。我知道和方法,但是在我的应用程序中,我不确定谁将负责调用这些方法之一。 在具有多个活动的应用程序中关闭的正确方法是什么,并且在此上创建的的生命周期与其中的活动不同。它不能是任何活动的。如果我不关闭它,并且进程没有被OS杀死-新的可能会在下一个应用程序“启动”时创建,而这个将会泄漏。或者,创建一次,存储在一个静态字段,从不退出,

  • Thread,Looper和Handler的关系 与Windows系统一样,Android也是消息驱动型的系统。引用一下消息驱动机制的四要素: 接收消息的“消息队列” 阻塞式地从消息队列中接收消息并进行处理的“线程” 可发送的“消息的格式” “消息发送函数” 与之对应,Android中的实现对应了 接收消息的“消息队列” ——【MessageQueue】 阻塞式地从消息队列中接收消息并进行处理的“

  • 本文向大家介绍Android消息处理机制Looper和Handler详解,包括了Android消息处理机制Looper和Handler详解的使用技巧和注意事项,需要的朋友参考一下 Android系统的消息队列和消息循环都是针对具体线程的,一个线程可以存在(当然也可以不存在)一个消息队列和一个消 息循环(Looper),特定线程的消息只能分发给本线程,不能进行跨线程,跨进程通讯。但是创建的工作线程默

  • 似乎在主线程中,我只需要编写一个扩展Handler并覆盖其handleMessage方法的类。然后我可以只创建Handler对象而无需准备looper。 在主线程中,以下代码起作用: 但是在worker线程中你确实需要先准备looper然后才能创建Handler对象,否则threadLocal.get()就不能为当前worker线程获取looper。我的问题是一定有地方为主线准备弯针,但我就是找不

  • 问题内容: 我知道要从Javascript到Java进行交互,您必须使用webview中的addjavascriptInterface方法注入Java对象。 这是我面临的问题。 我使用JS中可用的方法注册了一个Java对象。 我使用在网络视图中注入了一些JS 注入JS完成后,我将发送JS事件。 问题是,如果在执行步骤1之后立即执行以下Javascript: 我在控制台日志中收到“找不到myobje

  • 编辑: 大家好,我需要一些帮助。实际上,我想从url获取并使用一些有用的数据。我有一个网站,显示在特定地区的一些重大事故的信息。我想从那个网站上了解那些事故的详细情况。我将在Android MapView中显示它们,并带有接点。我该怎么做?我经历了这一切,但仍然无法做到这一点。