首先在Android应用上下载数据

时间:2015-07-29 05:50:30

标签: android download android-asynctask

我有一个语言翻译应用,需要在第一次运行时下载一些初始数据。首次启动应用程序时,第一步是从服务器获取当前支持的语言列表。然后,用户选择他们希望安装的内容,然后下载其余的表。

我检查本地数据库中是否存在语言,如果没有,请连接到服务器并将其下载为JSON。在从服务器检索此数据之前,用户无法执行任何操作。

如果没有网络连接,则会出现一个对话框,提示用户转到他们的WIFI设置。如果下载时出现网络错误,则另一个对话框会提示用户立即重试,或等到以后再尝试。如果下载成功,则会启动新的Intent以发送它们以选择要安装的语言。

我的功能大部分都在运行(我的AlertDialogs没有显示),但问题是这是否是实现这一目标的正确方法。我目前已将其设置为AsyncTask,但我看到很多帖子的回复大吼大叫,当UI依赖它时,不应该如何使用AsyncTask。很公平,但AsyncTask似乎是下载数据的推荐方法。

AsyncTask是下载数据的正确方法,还是有首选备选方案?

如何在UI上最好地处理这个问题,因为它取决于这些数据?一个闪屏?我宁愿没有,但似乎应该有一些东西,如果有必要,我需要在某处显示AlertDialogs。

1 个答案:

答案 0 :(得分:0)

  

AsyncTask是下载数据的正确方法,还是有首选备选方案?

不,AsyncTask不适合联网,因为:

  1. 您需要一个开始此任务的组件。 Activity不是一个好选择,因为您的网络请求将与UI绑定,并且很难处理屏幕旋转等。

  2. AsyncTask默认情况下适用于全局串行执行程序。它将阻止应用程序中的所有其他异步任务,直到完成为止。所以你必须提供自己的执行者来避免这种情况。

  3. 根据http://developer.android.com/guide/components/processes-and-threads.html,流程级别为后台流程 使用Service,您可以更好地实现服务流程

  4. 请改用Service。您可以在其中实现任何您想要的线程。您可以使用常规ThreadThreadPoolExecutorHandler或某些第三方解决方案。 Service为您提供了极大的灵活性。

    关于第二个问题,请先查看材料设计规范:https://www.google.com/design/spec/material-design/introduction.html

    提出一些想法然后再问一个单独的问题,如果还不清楚的话。