我正在开发一个必须与服务器进行大量交互的应用程序,因此用户输入名称和密码以及授权后必须执行以下任务:


该应用程序必须获取该用户的所有传入和传出消息,并将它们加载到SQLite数据库中。
提取所有用户朋友(具有ID,名称,contact_data的JSON),并将其加载到应用程序的数据库中
跳至下一个活动并显示本地数据库中的收入消息。
这个操作太慢的问题是,当应用程序启动新活动时,还没有什么东西可以从数据库中获取:AsyncTasks还没有完成。我被迫使用AsyncTask.get()来等待它们全部完成,但这需要等待超过16秒!该怎么办:使用线程,或者在将获取的数据加载到数据库之前将其保存在内存中并在新活动中显示,而不是从数据库中获取它,但是即使没有数据库任务,其他获取任务也需要花费时间等待近10秒!该怎么办?

最佳答案

好吧,这里发生了几件事情出了错。


不要将AsyncTasks用于网络。使用服务。简而言之,这是因为您的AsyncTask将停止,而启动它的Activity将停止。这意味着网络请求很容易中止,数据丢失,并且必须在再次打开活动时重新启动。
不要在AsyncTasks上使用.get()。这使UI线程等待任务完成,从而使整个AsyncTask想法变得毫无用处。换句话说:这会阻塞您的UI。


您应该做什么:


阅读有关使用服务的信息。您也可以查看一个名为RoboSpice的强大开源库,以帮助您解决这一问题。
如果您想知道何时完成,请停止在AsyncTasks上使用.get(),只需使用侦听器即可。
尽可能在线程池(myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);)上执行AsyncTasks。

关于java - AsyncTasks太慢,无法同时进行多个网络操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15763464/

10-09 07:31