从所有活动访问自定义对象的数组/集合,Android

时间:2018-01-31 22:05:50

标签: java android arrays

我是第一个潜入Android Studio的潜水员,正在开发我的第一个应用程序,这是一种冲浪日志应用程序。基本上它是每次用户外出冲浪时跟踪各种天气状况。

我创建了一个Java类" Session"包含以下字段:

  • 日期(日期)
  • 位置(字符串)
  • 潮汐高度(浮动)
  • 冲浪大小(浮动)
  • 更多信息,暂时保持简单。

我的申请将如下:

将有一个主要主屏幕活动,带有按钮,还有一个显示3个最近会话的小型桌面视图。 按钮包括:

  • 新会话:这将带您进入一个新活动,其中包含上述每个字段的各种文本输入,日期选择器...和保存按钮。
  • 我的会话:这会将您带到一个桌面视图,您可以在其中查看所有过去的会话。你可以按地点,日期,冲浪大小来组织它们......

因此我的问题是:

在各种活动之间传递所有这些数据的最佳做法是什么?

对我而言,最明显的方法是让一个中心ArrayList加载到主活动中,然后以某种方式传递给所有后续活动。它包含您创建的所有会话。

所以,我想点击"新会话"主屏幕上的按钮。这将我带到新的Session活动。我输入所有字段并点击保存。我想获取这些数据,创建一个新的会话对象,然后将其添加到主活动中的数组中。到目前为止,我的研究告诉我使用bundle和intent.putextra()技术传回所有这些数据。然而,这似乎很麻烦。有没有更好的方法,我可以创建一个Session类的新对象,然后将其附加到中央数组?

再说一遍,我说点击我的会话'主要活动的按钮。我希望这能够加载一个新的活动,这是一个tableview,允许用户滚动浏览所有以前创建的会话,然后点击一个查看详细信息。

我做了一些研究,似乎有各种各样的方法可以解决这个问题,我已经阅读过一些关于Singletons的内容,我已经研究过创建某种静态类然后,我可以参考多个活动,我已经阅读了关于parcelable和serializable的内容......

也许虽然拥有一些Android经验的人可以对实现我想做的事情的最有效和最标准的方式有所了解。

我想再次重申一下这个数组或者#34; Sessions"将成为应用程序的中心。几乎我在路上实施的每项活动都会在某种程度上使用这些数据。它是否显示一个可以不同方式排序的tableview,对其进行统计分析,在每个位置的地图上显示引脚......

2 个答案:

答案 0 :(得分:1)

我认为您希望将数据保存在数据库中,并使用pub / sub工作流来跟踪它。

例如,您可以使用Firebase。每当应用程序的一部分进行更新时(即使是不同设备上的不同用户),代码的任何其他部分都可以监听该更改并捕获它。

Firebase就是一个例子,RethinkDB,MongoDB都有这个选项。

使用应用程序上的数据结构不是一个好的选择:如果需要在应用程序的不同部分之间共享,它将变得非常混乱,如果您需要其他用户知道变化

答案 1 :(得分:0)

我认为你应该选择像RxJava2这样的基于事件的库。您可以轻松订阅公共汽车(主题),该公共汽车(主题)会发送到目前为止所创建的所有数据。以保持其他应用程序组件的最新状态。

为你的specefic用例。在RXjava2中有一个很棒的叫做Replay Subject

重播主题 无论订阅者何时订阅

,它都会发出源Observable的所有项目

一个简单的实现看起来像

 public class RxReplayBus {


private static ReplaySubject<Object> subject = ReplaySubject.create();

private RxReplayBus() {
    // hidden constructor
}


public static Disposable subscribe(@NonNull Consumer<Object> action) {
    return subject.subscribe(action);
}

public static void publish(@NonNull Object message) {
    subject.onNext(message);
  }

}

来自您的组件订阅:

  disposable = RxReplayBus.subscribe(new Consumer<Object>() {
        @Override
        public void accept(Object o) throws Exception {


        }
    });

并取消订阅使用:

    disposable.dispose();