在适配器中进行网络调用和处理响应是否很糟糕?

Posted

技术标签:

【中文标题】在适配器中进行网络调用和处理响应是否很糟糕?【英文标题】:Is it bad to make network calls and handle responses in an adapter?在适配器中进行网络调用和处理响应是不是很糟糕? 【发布时间】:2018-11-19 09:30:20 【问题描述】:

我的任务基本上是在工作中重新制作整个应用程序。本质上,该应用程序只是一个包含多种类型卡片的提要(想想带有更新卡、照片卡、OG 内容卡的 facebook)等。我将所有网络处理都移到了一个类中。你调用包含你想要的请求的方法,传入相关参数和一个监听器。进行网络调用,然后将响应传递给侦听器。

目前我有一个 Fragment 类,它使用我的自定义适配器填充一个 recyclerview。 Fragment 类通过在端点上发出分页请求来与我的网络类交互。例如,当单击特定 viewHolder 卡上的类似图标时,我是否应该有一个与我的片段通信的适配器侦听器?然后我应该让片段制作和管理该网络调用吗?我必须在这里考虑的问题是,如果网络响应失败,我需要取消设置 UI 元素(如点赞图标的颜色)以通知用户此时无法完成他们的请求。取消设置这些元素是回收站视图中该位置的视图持有者的属性。将所有这些视图持有者信息传递回片段似乎是错误的,只是为了让片段成为与我的网络类交互的唯一类。让我的适配器也处理网络请求有什么本质上的错误吗?

例如,在我的视图持有者元素上设置一个 onClickListener,当单击时更新 UI 并进行调用,然后响应适配器。如果成功,则保留一切,如果失败,则取消设置 UI。这种模式对我来说很有意义,并且将单个视图逻辑与片段分离。这样做好吗?很多谷歌搜索让我不相信。这是我的第一个业务应用程序,我想确保我遵循最好的模式。

我的记录片段看起来像这样

onCreate() 
  networkListener = new NetworkResponseListener() 
    //Process success response based on response code
    onSuccess(JSONObject response, responseCode) 
    onError(Error e, responseCode) // Handle Errors
  


//After scroll listener indicates I need to fetch again
NetworkHelper.makeFeedFetch(networkListener, LastId, GET_FEED_REQUEST_CODE);

因此,基本上我会在我的适配器类中执行相同类型的网络交互,以执行诸如单击图标之类的 viewHolder 等操作。这可以接受吗?

【问题讨论】:

【参考方案1】:

如果您真的想确保遵循最佳模式,则不应从片段中进行 NetworkCall。片段或活动应该只是查看对象,显示由其他类提供的数据,如 Presenters(如果您遵循 MVP)或 ViewModels(MVVM)。这些类也不进行直接的网络调用。

通常,我们使用从远程(Web 服务、远程 DB 等)或本地源(本地 DB)获取数据的存储库模式。 您的网络类是存储库源的候选者。然后对于每个动作 这是我们的业务逻辑所必需的,我们生成一个用例,如果这个用例需要存储库,我们将我们的存储库注入到我们的用例中。然后我们将这个用例注入我们的 Presenter 或 ViewModel。这么多的间接性可能看起来有点矫枉过正,但它提供了易于扩展和可测试的代码。回收站视图也是一个视图,因此您不应该进行网络调用 在回收站视图内部。

虽然不是一个精确的解决方案,但您的

在我的视图持有者元素上设置一个 onClickListener,当点击时更新 UI 并进行调用,然后响应适配器

是更好的海事组织。

【讨论】:

以上是关于在适配器中进行网络调用和处理响应是否很糟糕?的主要内容,如果未能解决你的问题,请参考以下文章

IBM Worklight 6.1 - 如何在较慢的网络中处理超时?

调用安全适配器返回响应错误 401

是否可以在不使用 WMI 的情况下获取网络适配器的 PnPDeviceId?

在android中的适配器内进行改造调用

基于 Java 的适配器 - 找不到返回值

安卓 网络请求数据处理(在适配器中处理)