【发布时间】:2014-08-06 19:12:46
【问题描述】:
假设我有一个简单的应用程序,其中包含:
带有列表视图的片段以显示书籍列表
保存片段的 Activity
一些网络组件会向某处的服务器发出查询以获取要显示的书籍列表
将这些组件连接在一起的最佳方式是什么?我看到了几个选项,但哪个是最好的(是否有任何最佳实践)?
Activity 向网络服务器发出查询(通过 AsynTask / new Thread),并将结果推送到片段
在没有 UI 的情况下创建另一个片段,并通过 AsyncTask / new Thread 进行查询(类似于选项 1,但会删除因屏幕旋转问题而被破坏的活动)
Fragment直接调用webserver,activity什么都不做
-
添加一个意图服务来执行查询,然后将结果广播到:
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