class TasksPresenter(val tasksRepository: TasksRepository, val tasksView: TasksContract.View) : TasksContract.Presenter {
private fun loadTasks(forceUpdate: Boolean, showLoadingUI: Boolean) { // 这里需要知道view的状态来判断是否需要显示loading,showLoading由view传递过来。这里已经开始让逻辑不单一了 if (showLoadingUI) { tasksView.setLoadingIndicator(true) } // 省略部分代码...
// 加载数据 tasksRepository.getTasks(object : TasksDataSource.LoadTasksCallback { override fun onTasksLoaded(tasks: List<Task>) { val tasksToShow = ArrayList<Task>()
// 当View不是active的时候直接返回,这里有要考虑View被销毁,回调还在的问题,代码持续ugly if (!tasksView.isActive) { return } if (showLoadingUI) { tasksView.setLoadingIndicator(false) } processTasks(tasksToShow) }
override fun onDataNotAvailable() { // The view may not be able to handle UI updates anymore if (!tasksView.isActive) { return } tasksView.showLoadingTasksError() } }) }
}
承担View职责的是一个Fragment
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
class TasksFragment : Fragment(), TasksContract.View { internal var itemListener: TaskItemListener = object : TaskItemListener { override fun onTaskClick(clickedTask: Task) { presenter.openTaskDetails(clickedTask) }
override fun onCompleteTaskClick(completedTask: Task) { presenter.completeTask(completedTask) }
override fun onActivateTaskClick(activatedTask: Task) { presenter.activateTask(activatedTask) } }
public class TasksViewModel extends AndroidViewModel { // 数据列表 public final ObservableList<Task> items = new ObservableArrayList<>(); // loading状态 public final ObservableBoolean dataLoading = new ObservableBoolean(false);
// 省略代码...
private void loadTasks(boolean forceUpdate, final boolean showLoadingUI) { // 只用设置loading的状态,不再需要持有View if (showLoadingUI) { dataLoading.set(true); }
mTasksRepository.getTasks(new TasksDataSource.LoadTasksCallback() { @Override public void onTasksLoaded(List<Task> tasks) { // 单纯的更新数据,而不再用操心View的状态 List<Task> tasksToShow = new ArrayList<>();
if (showLoadingUI) { dataLoading.set(false); } mIsDataLoadingError.set(false);