实施MVP以将数据从网络传递到listviews

时间:2016-05-26 19:40:58

标签: java android android-fragments design-patterns mvp

我想为以下内容实施MVP模式:
我的视图是显示列表的列表片段 我的模型是要显示在来自网络呼叫的列表中的数据 我的控制器是在视图和模型之间传递数据的控制器 我的流程是:
1)我做了一个网络请求并得到了我显示~20个项目的回复。每个项目都有一个项目的URL列表(~70) 2)点击一个项目,我进入一个循环并传递给一个排球队列请求每个这些URL(所以基本上)~70个排球请求一个接一个地提交。当我得到每个响应时,我更新了我的适配器。

问题:
如何转换(2)以便我使用MVP并通过某种回调机制更新视图?我认为回复每个回复都不是一个好主意,并且会召唤onNotifyDataSetChanged() 70次 这是什么最好的做法?

更多背景

我有一个应用程序,它由2个列表片段和1个带有布局视图的简单片段组成 第一个列表片段显示约20个项目的列表 单击时,每个项目都会产生一个网络调用,该服务从服务器带来~70个项目(最大),显示在第二个列表片段的另一个列表中。
一旦用户点击列表项,就会从网络中获取特定于该项的数据并显示在最后一个片段中 所以基本上第一个列表就是#34;破坏"到数据。但是第二个清单中的项目不超过70个。

设计:
我已经使用排球队列进行网络呼叫和功能 - 它工作正常,我显示我需要的数据 我已经为截击请求添加了一个监听器,并且从我的监听器中我更新了我的适配器 好处是,作为响应,我通过通知我的适配器来显示它们,因此用户在看到数据之前不必等待所有70个请求完成。

问题:
由于当我移动到第二个片段时点击第一个片段,我开始这些后端调用,当我转到第三个时,这些调用排队(我可以在日志中看到它),如果我转到第三个片段如果我回到第一个,其余项目的召唤将继续被解雇 由于我在适配器中获得来自Volley的这些请求的响应,并且实际片段可能不是相关的"我怎么能更好地设计呢? 我想某种模型视图模式,但在我的情况下,我不想等待所有网络调用完成从我的模型中获取数据(最好)

1 个答案:

答案 0 :(得分:0)

您可以使用与现在相同的设计,只需在为一个片段发出的请求中添加标签:

request.setTag("fragX");

然后当您隐藏/删除片段时,您可以执行以下操作:

getRequestQueue().cancelAll("fragX");

这将阻止您从已入队的人那里收到“fragX”回复。

您还可以提交您收到的回复并进一步使用RxJava以便您可以使用流,除了过滤之外,还可以对响应执行各种其他方便的操作。

我使用jus作为Volley的分支开始但现在支持许多选项,包括RxJava。您也可以使用示例和齐射迁移样本。