有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java对象到片段的通信

我可能错过了接口的概念,因为出于某种原因,我似乎无法理解这一点。以下是我的设想:

期望的结果

我想要一个非片段/非活动Java类Routines.javaRoutines.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方法的条件。如果您能帮助我理解如何实现这一点,我将不胜感激


共 (5) 个答案

  1. # 1 楼答案

    你看过观察者模式吗?,我认为这是一条路。 祝你好运

    看一个例子here

    如您所见,您可以将其用于一个或多个观察者

  2. # 2 楼答案

    我认为你应该换一种想法。让我们先问一下,是谁启动了后台任务?如果片段是调用方,那么接口/侦听器方法的工作方式如下:

    //inside fragment 
    Routines.doTaskInbackground(new TaskListener(){
    
      onComplete(){ // task completed }
       //do your work here
    });
    
    
    //inside routines
    public static void doTaskInbackground(TaskListener listener){
    
    //on complete
    listener.onComplete();
    
    } 
    

    您还可以使用线程和处理程序来实现这一点,方法是将处理程序传递给类例程,并在类内部将消息传递给该处理程序

    如果片段不是启动后台任务的部分,并且您没有来自片段的实例或侦听器,或者在例程类中包含它的活动,那么广播意图应该是可以的

  3. # 3 楼答案

    对片段调用代码的最简单方法是保留对它的引用。仅仅因为对象不是活动并不意味着不能将片段引用传递给例程对象,但要小心,不要因为保存引用的时间过长而浪费内存

    FragmentA fragment = (FragmentA) getFragmentManager().findFragmentById(R.id.example_fragment);
    fragment.finished(myInt); 
    

    Calling a Fragment method from a parent Activity

  4. # 4 楼答案

    在回顾了@gatunox的建议(“观察者模式”)之后,我对这种模式进行了一些研究,发现它确实能满足我的需求。我喜欢可以通知多个对象状态变化的想法。我实现了以下目标:

    片段a

    public class FragmentA extends Fragment implements Observer{
     ...
     @Override
        public void update(Observable observable, Object data) {
    
            Logging.log("FragmentA observed the following from Routines: "+data);
    
        }
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                    Bundle savedInstanceState) {
    
            routines = new Routines(getActivity().getApplicationContext());
    
            ((MainActivity)getActivity()).actionObserver.addObserver(this);
    

    常规。java

    ((MyApp)appContext).actionObserver.updateStatus("Routine finished!!");
    

    行动观察者。java

    public class ActionObserver extends Observable {
    
    
        public void updateStatus(String message){
    
            setChanged();
            notifyObservers(message);
        }
    
    }
    

    主要活动。java

    MyApp bApp = (MyApp) getApplication();
    actionObserver = bApp.getObserver();
    

    现在当Routines.java执行该行时FragmentAupdate方法被触发

  5. # 5 楼答案

    您是否考虑过使用事件总线系统ala otto

    http://square.github.io/otto/

    你可以在你的日常活动中发布一个事件。java类

    bus.post(new FinishedEvent(position));
    

    然后您可以订阅接收片段中的事件

    bus.register(this);
    
    @Subscribe public void OnRoutineFinished(FinishedEvent event) {
         // TODO: React to the event somehow!
    }