11

希望有人可以向我解释这一点,或者指出我可以阅读的资源以了解更多信息。我正在构建一个应用程序,它使用一个ListView和一个自定义列表适配器,我模仿了许多在线可用教程之一,例如这个:

http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/

它工作得很好。但是,如何执行此操作的每个示例都运行构建要显示的对象列表并在单独的线程上收集所需数据的过程。

我想知道为什么/你不能把所有东西都放进去onCreate吗?我看不出你需要单独的线程来实现这一点的原因。对于我必须在某些线程上运行的时间/内容是否有一些通用形式/标准?

4

6 回答 6

7

与大多数事情一样,这方面的 Android 文档非常好。

结果是:UI 应该始终是响应式的。所以if you have some operation that will take enough time that the user will notice, you might want to consider not running it in the UI thread。一些常见的例子是network IOdatabase accesses。不过,这取决于具体情况,因此您必须自己打个电话。

于 2012-12-24T17:19:52.067 回答
2

好吧,如果构建对象列表不是一个相对较短的过程,那么在 onCreate() 中执行此操作将阻塞/减慢主线程。如果您使用单独的线程,它将允许 android 操作系统在您等待填充列表时加载所有 UI 元素。然后,当对象列表准备就绪时,您可以立即填充已经初始化的 UI,而不是等到对象列表构建完成后再初始化 UI。它确保您的应用程序始终响应用户。

于 2012-12-24T17:17:54.830 回答
0

因为您只有 0.5 秒的时间来执行 onCreate — 之后会显示可怕的 ADN(应用程序无响应)错误消息。因此,除非您的列表视图非常简单,否则您将无法及时完成。即使您的列表视图非常简单,最好以正确的方式学习它。

顺便说一句:我什至不使用线程,我使用一个或多个服务来完成所有工作。实施起来更加困难,但也更加健壮和响应迅速。

于 2012-12-24T17:19:55.750 回答
0

您不在 onCreate 或 UI 线程中执行操作的原因是为了响应。如果您的应用程序处理时间过长,则会向用户显示“应用程序无响应”对话框。

于 2012-12-24T17:20:50.680 回答
0

我的老师曾经说过:每个软件都可以用一个(大)for循环编写。

如果您认为:它可能是......也许在 NDK 级别。

一些 SDK 开发人员希望使软件开发人员的任务更容易,这就是为什么存在 SDK 和框架。

除非您不需要多任务处理中的任何内容,否则您应该使用单线程。

有时有时间限制,有时有 UI/背景/网络限制,需要在 diff 线程中做一些事情。

于 2012-12-24T17:21:45.593 回答
0

如果你看到 Asyntask 和 Handler 的源代码,你会看到它们的代码纯粹是用 Java 编写的。(当然,也有一些例外,但这不是重点)。

为什么是这个意思?这意味着在 Asyntask 或 Handler 中没有魔法。它们只是让您作为开发人员的工作更轻松。

例如:如果 ProgramA 调用 methodA(),methodA() 将与 ProgramA 在不同的线程中运行。您可以通过以下方式轻松测试:

Thread t = Thread.currentThread();
int id = t.getId();

为什么你应该使用新线程?你可以google一下。很多很多原因。

那么区别是什么呢 ?

AsyncTask 和 Handler 是用 Java 编写的(内部使用 Thread),所以你可以用 Handler 或 AsyncTask 做的所有事情,你也可以使用 Thread 来实现。

什么 Handler 和 AsyncTask 真正帮助你?

最明显的原因是调用者线程和工作线程之间的通信。(调用者线程:调用工作线程执行某些任务的线程。调用者线程可能并不总是 UI 线程)。而且,当然,您可以通过其他方式在两个线程之间进行通信,但是有很多缺点,例如:主线程不是线程安全的(在大多数情况下),换句话说,是危险的。

这就是为什么你应该使用 Handler 和 AsyncTask。他们为您完成大部分工作,您只需要知道要覆盖哪些方法。

Handler 和 AsyncTask 的区别:当 Caller 线程是 UI Thread 时使用 AsyncTask。这是android文档所说的:

AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers

我想强调两点:

1)UI线程的易用性(所以,当调用者线程是UI线程时使用)。

2)无需操纵处理程序。(意味着:您可以使用 Handler 代替 AsyncTask,但 AsyncTask 是一个更简单的选择)。

这篇文章中有很多东西我还没有说,例如:什么是 UI 线程,为什么它更容易。你必须知道每种背后的一些方法并使用它,你会完全理解为什么..

@:当你阅读Android文档时,你会看到:

Handler allows you to send and process Message and Runnable objects associated with a thread's MessageQueue

起初它们可能看起来很奇怪。请理解,每个线程都有每个消息队列。(如待办事项列表),线程将接收每条消息并执行此操作,直到消息队列为空。(啊,也许就像你完成工作上床睡觉一样)。因此,当 Handler 通信时,它只是给调用者线程一个消息,它会等待处理。(复杂?但你只知道,Handler 可以以安全的方式与调用者线程通信)

于 2012-12-24T18:00:55.010 回答