【问题标题】:Android App Architecture安卓应用架构
【发布时间】:2014-08-06 19:12:46
【问题描述】:

假设我有一个简单的应用程序,其中包含:

带有列表视图的片段以显示书籍列表

保存片段的 Activity

一些网络组件会向某处的服务器发出查询以获取要显示的书籍列表

将这些组件连接在一起的最佳方式是什么?我看到了几个选项,但哪个是最好的(是否有任何最佳实践)?

  1. Activity 向网络服务器发出查询(通过 AsynTask / new Thread),并将结果推送到片段

  2. 在没有 UI 的情况下创建另一个片段,并通过 AsyncTask / new Thread 进行查询(类似于选项 1,但会删除因屏幕旋转问题而被破坏的活动)

  3. Fragment直接调用webserver,activity什么都不做

  4. 添加一个意图服务来执行查询,然后将结果广播到:

    a) Activity - 将它们推送到 Fragment

    b) Fragment 直接接收广播

这些方法是否被认为比其他方法更好?

各种 Fragment 相关的帖子都说过“将 Fragment 视为视图,将 Activity 视为控制器”,因此这表明选项 3 可能不是一个好主意。

选项 2 似乎将活动视为控制器的混合体,将一些“控制器”功能委托给另一个片段,但关键不是“视图”片段

选项 4 看起来很有趣,但是您遇到了必须广播所有结果的问题(而 1 和 2 您将拥有实际的对象)。当然,您可以通过使用 LocalBroadcastManager 使广播更加高效(和安全),但您仍然需要广播所有网络结果。

如果我下载的是图像(实质性的)而不是(例如)转换为轻量级 Parcelable 对象的 JSON 消息怎么办?

正如我所说,我可以想到很多方法——我们认为正确的方法是什么?

【问题讨论】:

  • 我已经完成了Fragments。我使用Activity 作为控制器,并创建一个自定义ViewGroup 类,它是所有显示Views 的父类。 IntentServices 是处理异步网络请求的好方法。
  • 我觉得第四个选项是最好的:添加一个意图服务来进行查询,然后将结果广播到:a) Activity - 将它们推送到 Fragment b) Fragment 直接接收广播
  • 另外,不要使用 BroadcastManager 来广播结果,用它来通知有个新结果。将数据序列化为意图的成本很高。
  • 最后一条评论很有趣,如果我要广播通知有个新结果,那么我将如何将结果转移到活动中?通过内容提供者?对于不打算离开您的应用程序的数据来说,这不是矫枉过正吗? (如果我没记错的话,ContentProvider 文档的开头部分说了一些类似的话)。或者您是说替换 IntentService 而是将服务绑定到活动?
  • 我只是在使用一个专用的数据管理器类,它可以通过Application 实例访问。

标签: android android-fragments android-asynctask android-broadcast android-intentservice


【解决方案1】:

您的所有问题都可以通过 Loaders 解决。这就是他们的设计目的。查看开发指南:http://developer.android.com/guide/components/loaders.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2011-09-10
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多