Java Android-活动-线程基础
我仍然对线程感到困惑。我仍然可以看到一些答案,指向线程、UI线程、后台线程、主线程等(主要是异步任务和从后台线程更新UI等) 有人能给我一个完整的解释围绕这些或一些链接至少 如果答案涵盖以下情况,那就太好了:Java Android-活动-线程基础,java,android,multithreading,android-activity,Java,Android,Multithreading,Android Activity,我仍然对线程感到困惑。我仍然可以看到一些答案,指向线程、UI线程、后台线程、主线程等(主要是异步任务和从后台线程更新UI等) 有人能给我一个完整的解释围绕这些或一些链接至少 如果答案涵盖以下情况,那就太好了: 所涉及的所有线程: 运行活动时(设置内容视图、附加一些按钮、一些对话框消息) 具有异步任务的活动 后台服务 HTTP调用 UI线程(主线程)-实例化(添加)该线程上的所有UI元素至关重要,这就是为什么它有一个昵称UIThread AsyncTask—有doInBackground、on
所涉及的所有线程:
- 运行活动时(设置内容视图、附加一些按钮、一些对话框消息)
- 具有异步任务的活动
- 后台服务
- HTTP调用
- UI线程(主线程)-实例化(添加)该线程上的所有UI元素至关重要,这就是为什么它有一个昵称UIThread
- AsyncTask—有doInBackground、onPostExecute等方法,它们有自己的生命周期
- 后台服务(Service):默认情况下,服务与应用程序在同一进程中运行。在它自己的线程中。(正如@MisterSmith所指出的)默认情况下,服务与应用程序在同一进程中运行。在它自己的线程中。因此,您需要在服务中使用异步处理来在后台执行资源密集型任务。在应用程序进程中运行的服务有时称为本地服务。 您可以指定在自己的进程中运行服务:
- 使用
执行HTTP调用(来自文档:HttpClient
new-thread(new-Runnable(…).start()在非UI线程上执行
,否则由于@vikram,您将获得NetworkOnMainThreadException
。但似乎HttpClient.execute()
方法是在线程中执行的,这就是为什么它需要一个处理程序作为参数之一,以便将结果传递给相应的处理程序(处理程序在UI线程上运行,可以根据需要更新小部件(UI元素)
额外:
- 要强制在主线程上执行某些内容,请使用
yourContextInstance.runOnUiThread(newrunnable(..)代码>
- 为了确定当前线程是否为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线程上调用。此步骤通常用于设置