栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在活动之间共享数据的最佳方法是什么?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在活动之间共享数据的最佳方法是什么?

这里是实现此目的的最常用方法的汇编:

  • Send data inside intent
  • Static fields
  • HashMap of WeakReferences
  • Persist objects (sqlite, share preferences, file, etc.)

TL; DR:有两种共享数据的方式:在Intent的Extras中传递数据或将其保存在其他地方。如果数据是原始数据,字符串或用户定义的对象:请将其作为附加意图的一部分发送(用户定义的对象必须实现Parcelable)。如果传递复杂对象,则将实例保存在其他位置的一个实例中,然后从启动的活动中访问它们。

有关如何以及为何实施每种方法的一些示例:

在意图内发送数据

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);intent.putExtra("some_key", value);intent.putExtra("some_other_key", "a value");startActivity(intent);

在第二项活动中:

Bundle bundle = getIntent().getExtras();int value = bundle.getInt("some_key");String value2 = bundle.getString("some_other_key");

如果要传递原始数据或String,请使用此方法。你还可以传递实现的对象

Serializable

尽管很诱人,但在使用之前你应该三思而后行

Serializable
:它容易出错并且非常慢。因此,一般而言:尽可能远离
Serializable
。如果要传递复杂的用户定义对象,请查看
Parcelableinterface
。实施起来比较困难,但与相比,它具有可观的速度提升
Serializable

共享数据而不保留到磁盘
考虑到大多数情况下两个活动都在同一进程中运行,可以通过将活动保存在内存中来共享活动之间的数据。

注意:有时候,当用户离开你的活动(不退出活动)时,Android可能会决定终止你的应用程序。在这种情况下,我经历了一些案例,其中android尝试使用应用程序被杀死之前提供的意图启动最后一个活动。在这种情况下,存储在单例(你的或Application)中的数据将消失,并且可能会发生不良情况。为避免这种情况,你可以将对象持久保存到磁盘上,或者在使用数据以确保其有效之前检查数据。

Use a singleton class

有一个类来保存数据:

public class DataHolder {  private String data;  public String getData() {return data;}  public void setData(String data) {this.data = data;}  private static final DataHolder holder = new DataHolder();  public static DataHolder getInstance() {return holder;}}

从启动的活动中:

String data = DataHolder.getInstance().getData();

使用应用程序单例
应用程序单例android.app.Application是启动应用程序时创建的实例。你可以通过扩展来提供自定义的Application:

import android.app.Application;public class MyApplication extends Application {  private String data;  public String getData() {return data;}  public void setData(String data) {this.data = data;}}

在启动活动之前:

MyApplication app = (MyApplication) getApplicationContext();app.setData(someData);

然后,从启动的活动中:

MyApplication app = (MyApplication) getApplicationContext();String data = app.getData();

静态场
这个想法与单例基本相同,但是在这种情况下,你提供对数据的静态访问:

public class DataHolder {  private static String data;  public static String getData() {return data;}  public static void setData(String data) {DataHolder.data = data;}}

从启动的活动中:

String data = DataHolder.getData();的HashMap WeakReferences

同样的想法,但是允许垃圾收集器删除未引用的对象(例如,当用户退出活动时):

public class DataHolder {  Map<String, WeakReference<Object>> data = new HashMap<String, WeakReference<Object>>();  void save(String id, Object object) {    data.put(id, new WeakReference<Object>(object));  }  Object retrieve(String id) {    WeakReference<Object> objectWeakReference = data.get(id);    return objectWeakReference.get();  }}

在启动活动之前:

DataHolder.getInstance().save(someId, someObject);

从启动的活动中:

DataHolder.getInstance().retrieve(someId);

你可能需要也可能不必使用意图的附加对象传递对象ID。这完全取决于你的特定问题。

将对象持久化到磁盘
这个想法是在启动其他活动之前将数据保存在磁盘中。

优点:你可以从其他地方启动活动,如果数据已经保存,则应该可以正常工作。

缺点:麻烦,并且需要更多的时间来实施。需要更多代码,因此有更多引入错误的机会。它也会慢很多。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/384120.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号