java对象到片段的通信
我可能错过了接口的概念,因为出于某种原因,我似乎无法理解这一点。以下是我的设想:
期望的结果
我想要一个非片段/非活动Java类Routines.java
在Routines.java
内的后台线程完成时触发FragmentA
内的一个方法
当前行为
目前,我通过广播{
问题
我想知道是否有可能实现一个接口,这样我就可以摆脱广播意图,或者一般来说,是否有更好的方式从非片段/活动类到片段/活动进行通信
实现从一个片段到一个活动的接口的解决方案不是我正在寻找的,因为我已经知道如何做到这一点,但如果通信的一方不是一个活动或片段,我似乎无法让它工作
我尝试过的
//in Routines.java
public class Routines implements FragmentA.OnRoutineFinishedListener
public void finished(int position){
...
}
//in FragmentA
public interface OnRoutineFinishedListener {
public void finished(int position);
}
我的主要问题是,当我不能使用典型的onAttach(Activity activity){ ... set up callback here by casting activity as the interface}
方法时,我不确定如何准确地调用这些方法:
public void onAttach(Activity activity){
super.onAttach(activity);
try {
mCallback = (SomeFragment.SomeListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement SomeListener");
}
}
当它是片段到活动时,上面的代码使mCallback
对我可用,这样我就可以自由地调用实现方法,但我没有这种奢侈,因为我试图获得一个非片段来触发片段中的函数
问题总是在于如何实际触发Routines
最终在FragmentA
内触发finished
方法的条件。如果您能帮助我理解如何实现这一点,我将不胜感激
# 1 楼答案
你看过观察者模式吗?,我认为这是一条路。 祝你好运
看一个例子here
如您所见,您可以将其用于一个或多个观察者
# 2 楼答案
我认为你应该换一种想法。让我们先问一下,是谁启动了后台任务?如果片段是调用方,那么接口/侦听器方法的工作方式如下:
您还可以使用线程和处理程序来实现这一点,方法是将处理程序传递给类例程,并在类内部将消息传递给该处理程序
如果片段不是启动后台任务的部分,并且您没有来自片段的实例或侦听器,或者在例程类中包含它的活动,那么广播意图应该是可以的
# 3 楼答案
对片段调用代码的最简单方法是保留对它的引用。仅仅因为对象不是活动并不意味着不能将片段引用传递给例程对象,但要小心,不要因为保存引用的时间过长而浪费内存
Calling a Fragment method from a parent Activity
# 4 楼答案
在回顾了@gatunox的建议(“观察者模式”)之后,我对这种模式进行了一些研究,发现它确实能满足我的需求。我喜欢可以通知多个对象状态变化的想法。我实现了以下目标:
片段a
常规。java
行动观察者。java
主要活动。java
现在当
Routines.java
执行该行时FragmentA
的update
方法被触发# 5 楼答案
您是否考虑过使用事件总线系统ala otto
http://square.github.io/otto/
你可以在你的日常活动中发布一个事件。java类
然后您可以订阅接收片段中的事件