希望有人可以向我解释这一点,或者指出我可以阅读的资源以了解更多信息。我正在构建一个使用ListView
和自定义列表适配器的应用程序,我模拟了在线提供的众多教程之一,例如:
http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/
工作得很好。但是,每个如何执行此操作的示例都会运行构建要显示的对象列表并在不同线程上收集所需数据的过程。
我想知道为什么/你不能把所有内容都放入onCreate
?我看不出为什么你需要单独的线程来实现这一点的原因。是否有一些通用的形式/标准,我必须在某些线程上运行什么/什么?
答案 0 :(得分:7)
The Android docs就像大多数事情一样非常好。
结果是:用户界面应始终具有响应能力。所以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 IO
和database accesses
。这是个案的基础,所以你必须为自己打电话。
答案 1 :(得分:2)
好吧,如果构建对象列表不是一个相对较短的过程,那么在onCreate()中执行它会阻塞/减慢主线程。如果你使用一个单独的线程,它将允许android os加载所有的UI元素,而你正在等待填充列表。然后,当对象列表准备就绪时,您可以立即填充已初始化的UI,而不是等待初始化UI直到构建对象列表之后。它可确保您的应用程序始终对用户做出响应。
答案 2 :(得分:0)
因为你只有0.5秒来执行onCreate - 之后会显示可怕的ADN(应用程序没有响应)错误消息。因此,除非您的列表视图非常简单,否则您将无法及时完成。即使您的列表视图非常简单,最好以正确的方式学习它。
BTW:我甚至不使用线程,我使用一个或多个服务来完成所有工作。实施起来更加困难,但也更加强大和响应。
答案 3 :(得分:0)
您不在onCreate或UI线程中执行操作的原因是为了响应。如果您的应用程序处理时间过长,则会向用户显示“应用程序无响应”对话框。
答案 4 :(得分:0)
我的老师曾经说过:每个软件都可以写成一个(大)for循环。
如果你认为:它可能......可能在NDK级别。
一些SDK开发人员希望让软件开发人员的任务变得更加简单,这就是为什么存在SDK和框架。
除非您不需要多任务处理,否则您应该使用单线程。
有时存在时间限制,有时会出现UI /后台/网络限制,需要在差异线程中执行操作。
答案 5 :(得分: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的原因。他们为您完成大部分工作,您只需知道要覆盖哪些方法。
差异处理程序和AsyncTask:当调用程序线程是UI线程时使用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
一开始它们可能看起来很奇怪。只需了解每个线程都有每个消息队列。 (就像待办事项列表一样),线程将接收每条消息,直到消息队列为emty。 (啊,也许就像你完成你的工作并上床睡觉)。因此,当Handler进行通信时,它只是向调用者线程发出一条消息,它将等待处理。 (sophiscate?但你只知道,Handler可以安全地与调用者线程通信)