gpt4 book ai didi

java - Android 发布/订阅单例示例

转载 作者:搜寻专家 更新时间:2023-11-01 08:51:32 24 4
gpt4 key购买 nike

有人可以提供一个使用发布/订阅单例模式在 fragment 之间传递信息的简单示例吗?上周我问了passing data between fragments对于下面的场景,建议使用这种方法;我似乎无法理解它。

I have an application using the navigation drawer layout, with various "sub applications" that perform standalone functions (for example, a calculators app, with unrelated "sub apps" for income tax calculations, metric/imperial conversions, etc). For a given calculator, I'd have a data entry/selection fragment and a data presentation fragment that displays the calculation in some meaningful type of way. Thus, my only activity in the application is the MainActivity, holding the navigation drawer and content pane. The question is: what is the best way to design the application such that the various calculators pass data to their data representation fragments, say on the click of a button?

最佳答案

互联网上的所有例子...ks,他们的 UML 图对于初学者来说绝对不清楚,大量的代码只有有经验的人才能理解为什么使用这个而不是那个,而不是另一个...所以,让我们构建移动循序渐进,逻辑思考。

首先,您需要在您的单例类中创建某种存储 - 使数据不依赖于 fragment 的生命周期。根据您的应用程序的用途,它可能是不同种类的集合或只是原语。将此类字段添加到您的单例中,例如:

double conversionRate, taxRate;
int securityNumber;
.... // and so on

现在您需要一些单例方法来更新这些数据。我们称它为 updateData()。每当用户更改任何 fragment 中的某些数据时,该 fragment 都应调用:

Singleton.getInstance().updateData(dataType, data);

作为参数,让我们放入数据类型和包含这些数据的一些对象。

其次,在每次更新时,您都需要更新其他演示 fragment 中的数据,对吗?所以这个 updateData() 方法应该遍历当前正在运行的 fragment 列表,并向每个 fragment 发送新数据。如何实现? -- 很简单,通过回调方法。为此,您需要:

1) 使用一种方法创建一种Updateable 的公共(public)接口(interface):public void onUpdate(int dataType, Data data)

2) 通过类名后的implements Updateable在每个 fragment 上实现这个接口(interface)

3) 在类体中实现它唯一的方法onUpdate()。在这个实现中,每个 fragment 都会考虑,首先,它是否需要使用给定数据类型的数据,其次,处理这些接收到的数据(例如改变它的textview值):

@Override
onUpdate(int dataType, Data data){
if (dataType == DATA_TAX_RATE){
textViewTaxRate.setText(String.parseInt(data.getValue()));
}

}

第三,您的单例如何知道应该将更新数据发送给谁?非常简单:只需添加一个存储,将所有 fragment 作为 Updateable 对象包含在其中:

List<Updateable> listeners = new ArrayList<Updateable>;

并添加两个额外的方法来将对象(例如您的 fragment )注册和取消注册为监听器。在第一种方法中,您应该只将一个监听器添加到提到的列表中,在第二种方法中将其删除:

public void registerListener(Updateable listener){
if (!listeners.contains(listener)) {
listeners.add(listener);
}
}

public void unregisterListener(Updateable listener){
if (listener != null && listeners.contains(listener)){
listeners.remove(listeners.indexOf(listener));
}
}

现在,每个想要接收更新(即实现 Updateable 接口(interface))的 fragment 都应该在创建和恢复后立即注册为监听器:

Singleton.getInstance().registerListener(this);

并在 onDestroy 或不再需要监听更新时取消注册:

Singleton.getInstance().unregisterListener(this);

注意:为防止内存泄漏,当您不再使用此对象时,您应该注销监听器。否则对它的引用将保留在监听器列表中,使垃圾收集器无法访问它!

在我们创建了添加和删除监听器的方法之后,让我们回到前面提到的单例方法updateData()。它的主要目的是存储新数据并向所有监听器发送更新,所以让我们来实现它:

public void updateData(int dataType, Data data){
// store new data
if (dataType == DATA_TAX_RATE){
this.taxRate = data.getValue();
}

.....

// then iterate through listeners and send updated data to them
for (Updateable listener : listeners){
try {
listener.onUpdate(dataType, data);
} catch (Throwable e) {}
}
}

现在,每次用户更新任何 fragment 中的一些数据,或通过计算更新数据时,只需从该 fragment 调用 Singleton.getInstance().updateData(...) --新数据将存储在单例中并自动广播到其他 fragment 。

============================================= ===================

免责声明:这不是 Observer 设计模式的确切实现,只是其简化版本,以便初学者更加清晰易懂。这就是为什么我不使用诸如 Observernotify 等通用名称的原因。它只是更深入地理解通用设计模式的第一步的工作示例。

关于java - Android 发布/订阅单例示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22888022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com