Android -Activity - Thread Basics Android中的活动(Activity)和线程(Thread)基础知识

7 浏览
0 Comments

Android -Activity - Thread Basics Android中的活动(Activity)和线程(Thread)基础知识

我对线程还是有些困惑。我看到有些答案指向了线程、UI线程、后台线程、主线程等(主要是在AsyncTasks和从后台线程更新UI方面)。有人能给我一个完整的解释吗,或者至少给我一些链接吗?如果答案能涵盖以下情况,那就太好了:

涉及的所有线程有:

  • 当我运行一个活动(设置内容视图、添加一些按钮、一些对话框消息)
  • 一个带有AsyncTask的活动
  • 一个后台服务
  • 一个HTTP调用
0
0 Comments

Android应用程序默认只有一个线程,即主线程。主线程通常被称为UI线程,因为它是唯一可以访问UI的线程。默认情况下,所有操作都在主线程中进行。

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

- `onPreExecute()` 在UI线程中运行,在执行异步任务时首先调用。

- `doInBackground()` 在一个新创建的线程中运行,与主/UI线程分离。

- `onPostExecute()` 在后台任务返回后在UI线程中运行。

后台服务完全独立于应用程序运行,即使原始应用程序已被销毁,后台服务仍然可以持续运行。

Http调用在调用它的线程上进行,但是根据较新的Android API的要求,您不能再从主/UI线程进行任何网络活动(这实际上会引发异常并终止应用程序)。这是为了防止网络请求速度慢导致主线程阻塞,从而创建不流畅的用户体验。

后台服务:根据开发者指南,一个服务在其托管进程的主线程中运行-服务不会创建自己的线程,也不会在单独的进程中运行(除非您另行指定)。

我认为他指的是IntentService,这在口语中被称为“后台服务”。这是您自己的术语。所有服务都在后台执行操作。

原因:Android应用程序默认只有一个线程,即主线程。但是,如果在主线程中进行网络请求等耗时操作,会导致主线程阻塞,从而影响用户体验。

解决方法:将耗时操作放在新创建的线程中执行,或者使用后台服务进行处理。同时,遵循Android API的要求,不要在主线程中进行任何网络活动。

0
0 Comments

当运行一个Activity时(设置内容视图,连接一些按钮,一些对话框消息),通常只有一个线程(主线程,有时错误地称为UI线程)。

Activity - 使用异步任务。同样,默认情况下只有一个(主线程)。菜单和按钮处理程序也在主线程中运行。AsyncTask是另一回事。它创建了一个工作线程(顺便说一下,当退出Activity时,应该小心不要泄漏它)。

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

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

总之,我认为澄清短语“http调用”是什么意思很重要。例如,如果您使用WebView#loadUrl(),那么该调用是异步执行的,可以在主线程上进行。我知道你可以争辩说“http调用”是在后台线程上发生的,但在这种初学者问题的上下文中,明确表示总是很好的。

0
0 Comments

Android - Activity - Thread Basics问题的出现原因是在Android开发中,涉及到UI元素的操作必须在主线程(UI线程)上进行,否则会引发错误。而解决方法是使用异步处理机制,将耗时的操作放在后台线程中进行,避免阻塞主线程。

在Android开发中,涉及到线程的基本概念有以下几点:

1. UI线程(主线程):负责实例化(添加)所有UI元素,包括处理UI事件和绘制UI界面。

2. AsyncTask:是一种具有自己生命周期的类,其中包括doInBackground、onPostExecute等方法,用于在后台执行耗时操作。

3. 后台服务(Service):默认情况下,服务在与应用程序相同的进程中以自己的线程运行。因此,在服务中执行资源密集型任务时需要使用异步处理。可以选择将服务运行在自己的进程中,这样可以避免在服务的主线程上执行长时间操作,但需要使用进程间通信(IPC)与其他部分进行通信。

4. 使用HttpClient进行的HTTP调用必须在非UI线程上执行,否则会引发NetworkOnMainThreadException异常。然而,HttpClient.execute()方法似乎在一个线程中执行,因此需要使用处理程序(Handler)作为参数之一,以便将结果传递给相应的处理程序(处理程序在UI线程上运行,可以更新UI元素)。

5. 可以使用runOnUiThread方法强制在主线程上执行某些操作。

6. 通过Looper.getMainLooper().getThread() == Thread.currentThread()可以判断当前线程是否为UI线程。

UI线程负责事件的分发和绘制,因此需要在UI线程上处理所有与UI元素相关的操作。所以,当涉及到UI元素的操作时,必须在主线程上进行,否则会引发错误。

通过使用异步处理机制,可以将耗时的操作放在后台线程中进行,避免阻塞主线程。这样可以提高应用的响应性和用户体验。同时,使用Handler可以在后台线程中将结果传递给主线程,以更新UI元素。

以上是Android开发中涉及到Activity和线程的基本知识,希望对你有所帮助。

0