【问题标题】:GoogleMaps using rxJava with MVP使用 rxJava 和 MVP 的 GoogleMaps
【发布时间】:2018-10-28 14:52:47
【问题描述】:

我有一个应用程序,从现在开始我的 api 已经填写了一个列表。现在我正在检测recyclerView 上的onClick,并且我想打开一个GoogleMaps,其标记集中在我单击的项目上(我有经纬度)。 有没有一种好的方法可以用它的存储库、用例、模型等来做到这一点?

问题是我在 ModelView 上的坐标是它所在的坐标,猫的类型,还有 id。

问题是我不知道要向其他活动发送什么,因为每次我调用 api 时数据都会发生变化,所以我不知道是否必须将其存储在任何地方,然后从 listView 显示数据,然后在 mapActivity 上创建一个刷新按钮,我可以在其中从 api 重新启动数据。

希望你能理解我的问题。

我正在关注的一个例子是这个:GitHub repository 这是我的列表,然后当点击一个项目时它应该打开地图。

编辑

当我点击列表中的一个项目时,我最终通过了列表(如果您有任何其他方式,请随时告诉我)

然后我创建了一个合同:

interface Presenter{
        fun onMapReady()
    }

    interface View{
        fun focusOnItem(latitude: Double, longitude: Double)
        fun putMarkers(mList)
    }

然后我不知道在我的演示者上在哪里使用rxJava,因为我需要等到我为演示者设置了视图和数据等内容,当我填满所有内容后,首先开始执行 putMarkers,然后是 focusOnItem,但我坚持这一点。

所以我现在正在做的是从 mapActivity 我设置列表然后我想开始做这项工作。

TL;DR

从一开始我就有一个活动(这与Github repo 几乎相同,然后我需要将列表传递给我的其他活动我最终对演示者进行了设置,因为 dagger 不知道该列表所以,我现在的问题是如何使用 rxJava 设置所有 MVP 以加载地图并在其上加载标记。它还应该缩放到单击的元素,但我已经有了位置。

如果你说服自己这样做,我会接受你的答案作为一个简单的伪,我只需要弄清楚如何在 rxJava 中做到这一点。

【问题讨论】:

  • 可以使用实时数据的概念。看看这个帖子。 android.jlelse.eu/…
  • 但我必须更改所有代码
  • 我编辑了我的问题@Shamsul,欢迎回答

标签: android google-maps rx-java dagger-2 android-mvp


【解决方案1】:

您不应将大量数据从一个 Activity 传递到另一个 Activity,因为您很容易达到它们之间可能传递的最大数据量。

相反,您最好将数据保存在为一个活动分类的模型中(例如,包含列表的模型),然后只将一些项目 ID 传递给另一个活动。第二个 Activity(更准确地说,它的 Presenter)应该获取 id 并从模型中查询所需的对象。

总体而言,调用链如下所示:

  1. 带有项目列表的活动在创建时下载此项目。下载在调用 Interactor/UseCase 或直接调用 Repository 的 ItemsListPresenter 中启动。

  2. 使用存储库以某种方式缓存下载的项目。

  3. 下载的项目在视图中显示为列表(在我们的例子中 - 活动)。
  4. 当用户单击项目时,此单击将发送到 ItemsListPresenter,并发送调用以导航到 MapsView,并将所选项目 ID 作为参数传递。
  5. MapActivity被打开,传入的item id被取走。
  6. MapPresenter 在其构造函数(或设置器)中获取选定的 ID
  7. MapPresenter 从模型中获取所有点(在我们的例子中使用 Interactor/UseCase 或直接存储库)并显示它们。
  8. MapPresenter 使视图聚焦于选定点(该点通过其 id 从模型中获取)

因此,我们设法打开了一个包含所有点的屏幕,并且它会专注于用户选择的点。

您可以在此处找到基于 Clean Architecture 方法并使用 MVP 模式和 RxJava 2 创建的简单 Earthquakes 应用程序: https://github.com/Gaket/Earthquakes

更新:

更准确地说,你可以这样做(伪代码):

class Presenter extends IPresenter {

   Model model;
   View view;
   List<Item> elements;
   Item selectedElement;

   void setSelectedItem(String id) {
      element = model.getElement(id);
   }

   void start() {
      // if you need to make an api call - do it here
      model.getElements().subscribe(elements -> this.elements = elements);
   }

   void onMapReady() {
      view.showElements(elements);
      view.focus(selectedElement);
   }
}

class MapActivity implements View {
    IPresenter presenter;

    void onCreate(...) {
        // start your map fragment
        String id = // get id from Intent
        presenter.setSelectedItem(id);
        presenter.start();
    }

    void putMarkers(List<Item> elements) {
        // put your markers as usual
    }

    void focusOnItem(Element element) {
        // and focus works the same. The only question is if you want to send an Element object here or particular coordinates. Both variants work.
    }

    @Override
    void onMapReady(GoogleMap map) {
         // save map
         presenter.onMapReady();
    }

}

【讨论】:

  • 问题是使用 rxJava 和 GoogleMaps,那部分已经开发好了,是的,你是对的,我们不必从那里传递数据,但是如果你的 api 调用只是为了获取你不能从 id 得到的东西不好......
  • “使用 rxJava 和 GoogleMaps”是什么意思?您能获得一些您想使用的特定 API 示例吗?
  • 你能从你的服务器上通过 ID 获取一个项目吗?如果可以,那么您应该能够编写通常的 Repository -> Cache -> API 链,因此如果我正确理解,所有未来的请求都会从缓存中返回数据而不是 API。当然你也可以使用 RxJava 来实现。
  • 不,我不能,但现在我有一个问题,我有方法 fillMarkersOnMap 并将完整列表发送到我的活动,有没有其他干净的方法可以发送所有列表和让视图工作,例如在演示者中做吗?虽然我有不同类型的图像...
  • 是的,我在答案中建议,当您获得第一个活动的列表时,您可以将其保存在一些本地存储中,例如使用 Room。然后,当您打开详细信息屏幕时,您会从 db 中获取该数据,它会非常快。
【解决方案2】:

因此,我实际上不再建议人们以这种方式构建东西(我现在将适配器与视图分离,并让演示者协调两者),但我的较新示例是 Kotlin + Coroutines,因此可能无济于事你。

这是一个旧的开源 AlarmManager 应用程序,它有望至少展示您正在寻找的部分内容。那时我还不是 RxJava 的专家,所以要小心它可能不是最适合错误处理和内存管理的。

https://github.com/BracketCove/PosTrainer

【讨论】:

  • 我看到了,但不,这不是我需要的。
猜你喜欢
  • 1970-01-01
  • 2019-12-04
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多