2012-10-24 93 views
-1

我在寻找有关此问题的最佳做法。AsyncTask与否?服务器同步活动

基本上,在进入主要活动之前,我有一个“启动”活动的应用程序。用户根本无法做任何事情,因为应用程序需要先通过抛出一些HTTP请求来与服务器同步。

最简单的路线是按顺序在UI线程上运行每个HTTP请求。这有什么特别的问题吗? (即处理Android框架通常会被阻止?,...)。我喜欢在第一个版本中实现这个功能,并在稍后使用下面列出的方法进行完善。

否则,从用户角度来看,最好是每个HTTP请求同时启动一个AsyncTask,并在启动下一个活动时在UI线程中同步。

干杯。 l_ingenu

回答

0

我建议你使用的AsyncTask,而是使用IntentService :)

+0

IntentService的作业已排队。这并不总是可以接受的行为。 –

+0

来自Android ICS的AsyncTask(4.0)AsyncTask也被序列化(排队),这会破坏你的逻辑。当应用程序处于后台并且用户更改方向/更改活动时,IntentService还允许您继续进行网络工作。在这里寻找更多有关AsyncTask回归的信息:http://commonsware.com/blog/2012/04/20/asynctask-threading-regression-confirmed.html – StErMi

+0

AsyncTask序列化可以通过使用'executeOnExecutor()'来轻松解决。改变方向不是问题。 –

1

使用AsyncTask做你的HTTP调用的东西,因为从蜂窝开始,它是不允许上使用互联网业务UI线程(除非您更改策略)。

呼叫完成后,将所需结果返回至onPostExecute,然后决定是继续下一个Activity还是向用户发出错误。

+0

它被允许(仍然可以导致ANR),但是默认策略这种方法会抛出异常。但是,如果您确实需要,您可以启用此功能。 –

+0

如果您的API级别低于** 11 **,则会导致ANR,否则使用默认策略,它将抛出android.os.NetworkOnMainThreadException异常。阅读[this](http://www.androiddesignpatterns.com/2012/06/app-force-close-honeycomb-ics.html) – waqaslam

0

第一
第一件事你必须使用网络活动UI线程这是一个很好的做法是使用一个单独的线程
[http://developer.android.com/training/basics/network-ops/connecting.html ] [1]


其次,你需要在这里做一个选择:

,如果你的整个应用程序依赖于从服务器上的数据,并有显示在你的应用程序,你应该使用的AsyncTask和移动内容之前要获取到onPostExecute()中的下一个Activity。

如果您在应用程序中使用数据,并且在第一个屏幕中没有太多影响,用户正在查看使用服务。