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

时间:2018-06-09 14:58:34

标签: android android-recyclerview fragment adapter

我的任务是基本上重建整个应用程序。本质上,应用程序只是一个包含多种类型卡片的Feed(想想带有更新卡,照片卡,OG内容卡的Facebook)等等。我将所有网络处理都移到了一个类中。您可以调用包含所需请求的方法,传入相关参数和监听器。进行网络调用,然后向Listener传递响应。

目前我有一个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 个答案:

答案 0 :(得分:0)

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

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

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

  

在我的视图持有者元素上设置onClickListener,单击时更新UI并进行调用,然后回复适配器

是更好的IMO。