获取数据并传递给另一个 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
我的问题是哪种方法更好??
- 使用可打包
- 写入数据库并查询
- 单例类
我们到底什么时候需要使用加载器??为什么我们不能通过 Loaders 共享数据??
如果问题重复...请忽略??
这完全取决于您想要使用的方式 data.If 您希望将来使用数据,因为在应用程序被终止并重新启动后,您应该将其保存在数据库中。
我更喜欢 parcelable 而不是 singleton,因为我不必为清除数据而烦恼。
根据 Documentation 我们通常使用加载器来异步加载数据并监视数据源的变化。据我了解,您没有执行其中任何一项,因此在这种情况下不需要装载程序。
1.Database:如果以后要用到网络数据,或者做一些查询操作,根据需要进行过滤,还是用db比较好。
2.Singleton Class:大多数开发人员使用它是因为它更高效,可以在 getter 和 setter 的帮助下轻松更改和检索值。
第一部分的答案
可包裹:
在 Activity
或 Fragment
之间传递数据的最佳方法是使用 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 的插件。
数据库或共享首选项:
使用数据库或 SharedPreferences
在 Activity
或 Fragment
之间传递数据听起来很奇怪,并且由于它们并非设计为以这种方式使用,因此只会创建一个乱七八糟
单身人士:
阅读这篇内容丰富的文章 post Singletons are Pathological Liars。
结论:
我推荐 Parcelable
,或者如果你想变得真正懒惰,那就选择 Serializable
(根据大多数人的说法,这并不糟糕,但也不是很好)。
不要使用单例、数据库、静态字段等来搞乱你的代码。它们会回来困扰你。
第二部分答案:
When exactly we need to use Loaders
Loaders,你用的时候就是AsyncTaskLoader
,主要用于我们要从服务器获取数据的情况(通过web API), 或者在后台做一些事情。它与使用 Thread
或 AsyncTask
类似,但非常强大,因为它不会在屏幕旋转时被破坏,这与这两个不同。
你应该阅读 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。
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
我的问题是哪种方法更好??
- 使用可打包
- 写入数据库并查询
- 单例类
我们到底什么时候需要使用加载器??为什么我们不能通过 Loaders 共享数据??
如果问题重复...请忽略??
这完全取决于您想要使用的方式 data.If 您希望将来使用数据,因为在应用程序被终止并重新启动后,您应该将其保存在数据库中。 我更喜欢 parcelable 而不是 singleton,因为我不必为清除数据而烦恼。 根据 Documentation 我们通常使用加载器来异步加载数据并监视数据源的变化。据我了解,您没有执行其中任何一项,因此在这种情况下不需要装载程序。
1.Database:如果以后要用到网络数据,或者做一些查询操作,根据需要进行过滤,还是用db比较好。
2.Singleton Class:大多数开发人员使用它是因为它更高效,可以在 getter 和 setter 的帮助下轻松更改和检索值。
第一部分的答案
可包裹:
在
Activity
或Fragment
之间传递数据的最佳方法是使用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 的插件。数据库或共享首选项:
使用数据库或
SharedPreferences
在Activity
或Fragment
之间传递数据听起来很奇怪,并且由于它们并非设计为以这种方式使用,因此只会创建一个乱七八糟单身人士:
阅读这篇内容丰富的文章 post Singletons are Pathological Liars。
结论:
我推荐 Parcelable
,或者如果你想变得真正懒惰,那就选择 Serializable
(根据大多数人的说法,这并不糟糕,但也不是很好)。
不要使用单例、数据库、静态字段等来搞乱你的代码。它们会回来困扰你。
第二部分答案:
When exactly we need to use Loaders
Loaders,你用的时候就是AsyncTaskLoader
,主要用于我们要从服务器获取数据的情况(通过web API), 或者在后台做一些事情。它与使用 Thread
或 AsyncTask
类似,但非常强大,因为它不会在屏幕旋转时被破坏,这与这两个不同。
你应该阅读 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。