【问题标题】:How to dismiss progress bar from repository?如何从存储库中消除进度条?
【发布时间】:2020-03-05 05:39:29
【问题描述】:

我正在使用带有存储库的 MVVM 模式进行网络调用。

当我单击视图中的按钮时,它会触发视图模型中的保存/获取数据方法,然后调用存储库,其中我正在使用 Retrofit 进行网络操作。

现在我想从我在视图中开始的存储库(onResponse 或 onFailure)中使用正确的消息(如已保存、错误等)关闭我的进度条。

  public void onClick(View v) {
            ProgressDialog dialog = new ProgressDialog(getActivity());
            dialog.setMessage("saving...");
            dialog.show();
            cuttingUnitViewModel.saveProjectUnit();
        }

可以做我正在做的事情还是有更好的选择?

我只想说我想从存储库中返回 NETWORK STATE 和 DATA ,该怎么做?

【问题讨论】:

  • 您没有使用 LiveData 来更新您的结果吗?您如何管理将结果传递给您的活动。如果您这样做,只需编写代码以在您的活动/片段中获得结果时隐藏进度条
  • @ljk 1. 我在获取数据时得到响应对象。 2. 我在保存数据时返回 Void。除此之外,我还需要在响应失败时进行处理。
  • 我的经验在这里:medium.com/@ostap.radkovskyy/… 基本上你要么使用事件包装器,要么使用一次性事件,或者 @ljk 建议的。但不幸的是,没有一个场景是完美的。

标签: android retrofit2 android-progressbar


【解决方案1】:

我认为在您的情况下的主要问题是您发起呼叫并得到其响应,但您的活动不知道任何这些变化。如果没有这个,您可能必须创建一些自定义实用程序类或其他一些解决方法,在我看来这将是一个非常糟糕的做法。

我的建议是您在活动的ViewModel 中为您的响应创建一个MutableLiveData 对象,然后将此对象传递到您的存储库,这样当您的改造完成您的调用时,您可以将结果发布到您的 livedata 对象上。

在您的活动中,您应该观察此实时数据的变化。所以,当你得到结果并发布新值时,在活动 livedata 观察者的onChanged() 中你可以得到结果,甚至可以让你的进度条消失。

对不起,如果这太难理解了。这是一个不错的little tutorial,您可以参考。我想举个例子会让事情变得更容易。祝你好运!

【讨论】:

  • 我还想在被解雇之前更改进度条的消息和图标,或者我应该为此单独使用某种对话?
  • 如果你看一下教程,你会得到一个更好的主意。基本上你可以在你的 livedata 中传递整个响应。因此,当它的 onChanged 被触发时,您可以检索完整的数据并编写您计划对存储库进行响应成功/失败的任何内容。就像隐藏进度条或在活动视图本身中显示消息一样。
  • 那么我需要在我的存储库中跟踪两个实时数据吗?一个用于我从网络获得的实际 JSON 响应(如果有),另一个用于不同类型的情况,例如(成功、失败、错误等)
  • 我觉得你太糊涂了。您的视图模型中将有一个可变的 livedata 和一个返回 LiveData 以观察更改的 getter 函数。您需要将这个单一的实时数据传递到您的存储库并在那里使用 postvalue 方法。在您的活动中观察此单个实时数据,因此当该值被发布时,它将触发您观察此实时数据的活动中的更改。
  • 我想说的是,我想从存储库中返回 NETWORK STATE 和 DATA ,该怎么做? @ljk
【解决方案2】:

不,在 Repository 中执行 View 等活动是不合适的,因为此类仅用于处理来自不同来源的数据,这会产生紧密耦合。正确的设计是将回调函数设置回 View 从 Repository 类通过中间层(如 ViewModel)所在的类,直到它到达 View 层,然后在那里解除 ProgressBar

【讨论】:

    猜你喜欢
    • 2016-11-28
    • 1970-01-01
    • 2012-03-02
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 2020-10-23
    相关资源
    最近更新 更多