1

我正在开发一个必须与服务器进行大量交互的应用程序。

因此,用户输入名称和密码,授权后必须执行下一个任务:

  1. 该应用程序必须为该用户获取所有传入和传出消息并将它们加载到 SQLite 数据库。
  2. 获取所有用户朋友(带有 id、names、contact_data 的 JSON)并将其加载到应用程序的数据库中
  3. 跳转到下一个活动并显示来自本地数据库的收入消息。

    这个操作太慢的问题,当应用程序开始新的活动时,它什么都不能从数据库中获取:AsyncTasks 还没有完成。我被迫使用 AsyncTask.get() 以便等待它们全部完成,但这需要等待超过 16 秒!

    那么我应该怎么做:使用线程,或者在将获取的数据加载到数据库之前将其保存在内存中并在新的活动中显示它而不是从数据库中获取它?但是即使没有数据库任务,其他获取任务也需要将近 10 秒的等待时间!所以我该怎么做?

4

3 回答 3

2

好吧,这里有几件事很不对劲。

  1. 不要将 AsyncTasks 用于网络。使用服务。简而言之,这是因为您的 AsyncTask 将停止,只要启动它的 Activity 就会停止。这意味着网络请求很容易中止,数据丢失,并且在再次打开 Activity 时必须重新启动。

  2. 不要在 AsyncTasks 上使用 .get()。这使得 UI 线程等待任务完成,使得整个 AsyncTask 的想法有点没用。换句话说:这会阻止您的 UI。

你应该做什么:

  1. 阅读使用服务。您还可以查看一个名为 RoboSpice 的优秀开源库来帮助您解决这个问题。

  2. 停止在 AsyncTasks 上使用 .get(),如果你想知道它何时完成,只需使用监听器。

  3. 尽可能在线程池( myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); )上执行 AsyncTasks。

于 2013-04-02T12:23:05.040 回答
0

您应该使用服务。这样它总是可以完成它正在做的任务,你可以完成所有的任务。除此之外,您应该初始化应用程序一次,然后只更新数据..这不会花费 10 秒..而不是您遇到其他问题.. 但是该服务的好处是它可以运行的背景。请参阅:Android 教程中的服务

== 编辑

还可以看看GreenDao这个库安排了快速的 SqlLite 操作。没有大型设置!

于 2013-04-02T11:59:03.430 回答
0

AsyncTasks 并不意味着同时运行几个小任务。引用文档

首次引入时,AsyncTask 在单个后台线程上串行执行。从 DONUT 开始,这被更改为允许多个任务并行运行的线程池。从 HONEYCOMB 开始,任务在单个线程上执行,以避免并行执行导致的常见应用程序错误。

当您想同时运行多个任务时,请在 a 中使用Threads 。ThreadPool

你想如何处理这种情况取决于你。当后台任务花费太长时间时,您始终可以向用户显示一个警报对话框,然后在填充数据后将它们带到活动中。发生这种情况时,许多应用程序会显示“正在加载”屏幕。Spinner如果还没有可用数据,您还可以显示“加载”控件。永远不要显示空白屏幕。

如果服务器端调用在您的控制之下,请使用某种缓存来加快时间。任何持续超过一秒的 API 调用都会让用户不耐烦。如果不使用上一段中提到的技术之一。@Perception 的技术也是一种可以考虑的技术。

于 2013-04-02T12:13:20.620 回答