获取数据并传递给另一个 Activity 的最佳方式是什么?

What is the best way for fetching data and for passing to another Activity?

Most the app so far I had created, I fetch the data from Network and store it in a singleton class to share data between Activities, when I'm done with those data, I usually clear those setting it to NULL, its work perfectly well

我的问题是哪种方法更好??

  1. 使用可打包
  2. 写入数据库并查询
  3. 单例类

我们到底什么时候需要使用加载器??为什么我们不能通过 Loaders 共享数据??

如果问题重复...请忽略??

这完全取决于您想要使用的方式 data.If 您希望将来使用数据,因为在应用程序被终止并重新启动后,您应该将其保存在数据库中。 我更喜欢 parcelable 而不是 singleton,因为我不必为清除数据而烦恼。 根据 Documentation 我们通常使用加载器来异步加载数据并监视数据源的变化。据我了解,您没有执行其中任何一项,因此在这种情况下不需要装载程序。

1.Database:如果以后要用到网络数据,或者做一些查询操作,根据需要进行过滤,还是用db比较好。

2.Singleton Class:大多数开发人员使用它是因为它更高效,可以在 getter 和 setter 的帮助下轻松更改和检索值。

第一部分的答案

  1. 可包裹:

    ActivityFragment 之间传递数据的最佳方法是使用 Parcelable 对象。据说比Serializable更优化。有几个 libraries/plugins 可以帮助您创建 Parcelable 对象。最近有人提到 Parceler, created by John Carl. However, I personally use Android Parcelable code generator by Michal Charmas,IntelliJ IDEA 和 Android Studio 的插件。

  2. 数据库或共享首选项:

    使用数据库或 SharedPreferencesActivityFragment 之间传递数据听起来很奇怪,并且由于它们并非设计为以这种方式使用,因此只会创建一个乱七八糟

  3. 单身人士:

    阅读这篇内容丰富的文章 post Singletons are Pathological Liars

结论:

我推荐 Parcelable,或者如果你想变得真正懒惰,那就选择 Serializable(根据大多数人的说法,这并不糟糕,但也不是很好)。

不要使用单例、数据库、静态字段等来搞乱你的代码。它们会回来困扰你。

第二部分答案:

When exactly we need to use Loaders

Loaders,你用的时候就是AsyncTaskLoader,主要用于我们要从服务器获取数据的情况(通过web API), 或者在后台做一些事情。它与使用 ThreadAsyncTask 类似,但非常强大,因为它不会在屏幕旋转时被破坏,这与这两个不同。

你应该阅读 How to Use Loaders in Android and Alex Lockwood's posts on Loaders(这是一个 4 post 系列。非常详细和伟大)。

这是一种将数据传递给另一个人的非常酷的方法 activity 我在 Whosebug 的其他地方读到了这个,现在一直在使用它。它可能不适合您的用例,但听起来很适合。

例如,假设您要将可打包的 "DataModel" 从 ActivityA 传递到 ActivityB。

ActivityB 中创建一个名为 'start' 的 public 静态方法。

private static final String DATAMODEL_KEY = "datamodel_key";

public static void start(Context context, DataModel dataModel) {
        Intent intent = new Intent(context, ActivityB.class);
        intent.putExtra(DATAMODEL_KEY, dataModel);
        context.startActivity(intent);
    }

要启动 ActivityB,只需像这样调用上面的 'start' 方法

ActivityB.start(this, datamodel);

如果从 activity 调用,则使用 'this',或者使用片段 'getActivity()'。

这将包含在 ActivityB 中启动 ActivityB 的代码,例如私有静态最终 DATAMODEL_KEY 字段等。不过,要回答您的问题,请选择选项 1 并使用 parcelables 并尝试我在上面发布的代码以帮助使用数据启动 Activity。