Java Android-活动-线程基础

Java Android-活动-线程基础,java,android,multithreading,android-activity,Java,Android,Multithreading,Android Activity,我仍然对线程感到困惑。我仍然可以看到一些答案,指向线程、UI线程、后台线程、主线程等(主要是异步任务和从后台线程更新UI等) 有人能给我一个完整的解释围绕这些或一些链接至少 如果答案涵盖以下情况,那就太好了: 所涉及的所有线程: 运行活动时(设置内容视图、附加一些按钮、一些对话框消息) 具有异步任务的活动 后台服务 HTTP调用 UI线程(主线程)-实例化(添加)该线程上的所有UI元素至关重要,这就是为什么它有一个昵称UIThread AsyncTask—有doInBackground、on

我仍然对线程感到困惑。我仍然可以看到一些答案,指向线程、UI线程、后台线程、主线程等(主要是异步任务和从后台线程更新UI等)

有人能给我一个完整的解释围绕这些或一些链接至少

如果答案涵盖以下情况,那就太好了:


所涉及的所有线程:

  • 运行活动时(设置内容视图、附加一些按钮、一些对话框消息)
  • 具有异步任务的活动
  • 后台服务
  • HTTP调用
      • UI线程(主线程)-实例化(添加)该线程上的所有UI元素至关重要,这就是为什么它有一个昵称UIThread
      • AsyncTask—有doInBackground、onPostExecute等方法,它们有自己的生命周期
      • 后台服务(Service):默认情况下,服务与应用程序在同一进程中运行。在它自己的线程中。(正如@MisterSmith所指出的)默认情况下,服务与应用程序在同一进程中运行。在它自己的线程中。因此,您需要在服务中使用异步处理来在后台执行资源密集型任务。在应用程序进程中运行的服务有时称为本地服务。 您可以指定在自己的进程中运行服务:

      如果服务在其主线程中执行长时间运行操作,则在其自己的进程中运行服务不会阻塞应用程序。但是,由于服务在其自己的进程中运行,您需要使用一些进程间通信(IPC)从其他部分与您的服务进行通信

      • 使用
        HttpClient
        执行HTTP调用(来自文档:
      HTTP客户端的线程安全取决于实现和 特定客户端的配置

      ),必须使用
      new-thread(new-Runnable(…).start()在非UI线程上执行
      ,否则由于@vikram,您将获得
      NetworkOnMainThreadException
      。但似乎
      HttpClient.execute()
      方法是在线程中执行的,这就是为什么它需要一个处理程序作为参数之一,以便将结果传递给相应的处理程序(处理程序在UI线程上运行,可以根据需要更新小部件(UI元素)

      额外:

      • 要强制在主线程上执行某些内容,请使用
        yourContextInstance.runOnUiThread(newrunnable(..)

      • 为了确定当前线程是否为UI(主)线程:

      Looper.getMainLooper().getThread()==Thread.currentThread()

      关于服务中线程的有趣问题:

      为什么UI线程负责所有这些

      因为UI线程负责将事件分派到 适当的小部件(UI元素),包括绘图事件


      来源:从技术上讲,一个应用程序可以有任意多的线程,它们是由程序员任意创建的

      但是,默认情况下,标准android应用程序只有一个线程。这是主线程,通常称为UI线程(因为它是唯一可以访问UI的线程)。默认情况下,一切都发生在主线程中

      如果运行异步任务,不同的部分在不同的线程中运行,下面是一个基本的细分:

      onPreExecute()
      在UI线程中运行,并在执行异步任务时首次调用。
      doInBackground()
      在与主/UI线程分离的新生成的线程中运行。
      onPostExecute()
      在后台任务返回后在UI线程中运行

      后台服务完全独立于应用程序运行,即使原始应用程序被销毁,它也可以无限期运行

      http调用发生在您调用它的任何线程上,但作为较新的android API的要求,您不能再从主/UI线程执行任何网络活动。(这实际上会导致异常并终止应用程序)这是为了防止缓慢的网络调用阻塞主线程,从而创建不稳定的用户体验

      运行活动时(设置内容视图、附加一些按钮、一些对话框消息)

      通常只有一个线程(主线程,有时被错误地称为UI线程)。


      活动-使用异步任务

      同样,默认情况下只有一个(主)。菜单和按钮处理程序也在主线程中运行<代码>异步任务
      是另一回事。它会创建一个工作线程(顺便说一句,在退出活动时,您应该小心不要泄漏它)。



      后台服务

      默认情况下,服务在主线程中运行。广播接收机也是如此。这就是为什么主线程不是(仅仅)UI线程。但是,某些类型的服务(如流行的
      IntentService
      )会产生一个工作线程。



      http调用


      是一个同步操作,因此它会一直阻塞直到完成(这就是为什么您永远不应该在主线程中执行一个操作)。

      所有涉及的线程:

      运行活动时(设置内容视图、附加一些按钮、一些对话框消息)

      这里涉及UI线程或主线程

      具有异步任务的活动

      涉及UI线程和WorkerThread

      允许正确且轻松地使用UI线程。此类允许您在UI线程上执行后台操作和发布结果,而无需操纵线程和/或处理程序

      四个步骤

      执行异步任务时,任务将经历4个步骤:

    • onPreExecute()
      ,在执行任务之前在UI线程上调用。此步骤通常用于设置