Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对象到片段通信_Java_Android_Android Fragments - Fatal编程技术网

Java 对象到片段通信

Java 对象到片段通信,java,android,android-fragments,Java,Android,Android Fragments,我可能遗漏了接口的概念,因为出于某种原因,我似乎无法理解这一点。以下是我的设想: 期望的结果 我想要一个非片段/非活动Java类Routines.Java在Routines.Java内的后台线程完成时触发FragmentA内的方法 当前行为 目前,我通过广播FragmentA已注册并正在监听的意图,从Routines.java内部与FragmentA进行通信。尽管这个解决方案有效,我还是忍不住觉得这不是正确的方法 问题 我想知道是否有可能实现一个接口,这样我就可以摆脱广播意图,或者通常是否有更好

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

期望的结果

我想要一个非片段/非活动Java类
Routines.Java
Routines.Java
内的后台线程完成时触发
FragmentA
内的方法

当前行为

目前,我通过广播
FragmentA
已注册并正在监听的意图,从
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){…通过将Activity转换为接口来设置回调}
的典型方法时,我不确定如何准确地调用这些方法,如下所示:

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
对我可用,这样我就可以自由调用实现方法,但我没有这种特权,因为我试图获得一个非片段来触发片段中的函数


问题总是在于如何实际触发
例程
最终触发
内的
完成
方法的条件。如果您能帮助我理解如何实现这一点,我将不胜感激。

您是否了解了观察者模式?我认为这是一条路要走。 祝你好运

看一个例子


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

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

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

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

您可以在Routines.java类中发布事件

bus.post(new FinishedEvent(position));
然后您可以订阅接收片段中的事件

bus.register(this);

@Subscribe public void OnRoutineFinished(FinishedEvent event) {
     // TODO: React to the event somehow!
}

在回顾了@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!!");
public class ActionObserver extends Observable {


    public void updateStatus(String message){

        setChanged();
        notifyObservers(message);
    }

}
MyApp bApp = (MyApp) getApplication();
actionObserver = bApp.getObserver();
ActionObserver.java

((MyApp)appContext).actionObserver.updateStatus("Routine finished!!");
public class ActionObserver extends Observable {


    public void updateStatus(String message){

        setChanged();
        notifyObservers(message);
    }

}
MyApp bApp = (MyApp) getApplication();
actionObserver = bApp.getObserver();
MainActivity.java

((MyApp)appContext).actionObserver.updateStatus("Routine finished!!");
public class ActionObserver extends Observable {


    public void updateStatus(String message){

        setChanged();
        notifyObservers(message);
    }

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

现在,当
Routines.java
执行该行
FragmentA
update
方法被触发时。

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

//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();

} 
您还可以通过将处理程序传递给类例程并在类内部将消息传递给该处理程序,使用线程和处理程序来完成此操作


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

+1为我指明了正确的方向。我发布了一个完整的答案和代码,以展示我是如何实现我的问题的解决方案的,以便其他人可以看到它是如何完成的。非常感谢你的建议。很乐意帮忙,祝你好运