我正在开发一个必须与服务器进行大量交互的应用程序。
所以用户输入名称和密码,授权后必须执行下一个任务:
这个操作太慢的问题,当应用程序启动新活动时,没有什么可以从数据库中获取:AsyncTasks尚未完成。我被迫使用AsyncTask.get()以便在它们全部完成时等待但这需要等待16秒!
那么我应该怎么做:使用线程,或者在将获取的数据加载到数据库之前将其保存在内存中并将其显示在新活动中,而不是从数据库中获取它?即使没有数据库任务,其他提取任务也需要等待近10秒钟!那我该怎么办?
答案 0 :(得分:2)
这里有几件事情出错了。
不要使用AsyncTasks进行网络连接。使用服务。简而言之,这是因为只要启动它的Activity停止,AsyncTask就会停止。这意味着网络请求很容易中止,数据丢失,并且在重新打开活动时必须重新启动。
不要在AsyncTasks上使用.get()。这使得UI线程等待任务完成,使整个AsyncTask想法变得毫无用处。换句话说:这会阻止您的用户界面。
你应该做什么:
阅读使用服务。您还可以查看一个名为RoboSpice的优秀开源库来帮助您解决这个问题。
停止在AsyncTasks上使用.get(),如果你想知道它何时完成,只需使用一个监听器。
尽可能在线程池(myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);)上执行AsyncTasks。
答案 1 :(得分:0)
您应该使用服务。通过这种方式,它始终可以完成正在执行的任务,您可以完成所有任务。除此之外,你应该初始化应用程序一次,然后只更新数据..这不会花费10秒..而不是你有另一个问题..但服务的好处是这可以运行的背景。见:Services in Android Tutorial
==编辑
另请查看GreenDao此库可安排快速SQlLite操作。没有大型设置!
答案 2 :(得分:0)
AsyncTasks并不意味着同时同时运行几个小任务。引用docs
首次引入时,AsyncTasks在单个后台线程上串行执行。从DONUT开始,这被改为一个线程池,允许多个任务并行运行。从HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误。
如果要同时运行多个任务,请在Thread
中使用ThreadPool
。
您希望如何处理这种情况取决于您。当后台任务花费的时间过长时,您始终可以向用户显示警告对话框,然后在填充数据后将其带到活动中。许多应用都显示了“正在加载”的内容。发生这种情况时屏幕。您还可以显示“正在加载”#39; Spinner
控制是否还没有数据可用。永远不要显示空白屏幕。
如果服务器端呼叫在您的控制之下,请使用某种缓存来加快时间。任何持续时间超过一秒的API调用都会使不耐烦的用户感到厌烦。如果不采用前一段中提到的技术之一。如果你能做到,@ Perception的技术也是值得考虑的。