Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.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_Function_Callback - Fatal编程技术网

Java 何时使用回调函数而不是普通函数?

Java 何时使用回调函数而不是普通函数?,java,android,function,callback,Java,Android,Function,Callback,我很难理解回调的概念,为什么我需要使用回调函数而不是普通函数。到目前为止,我看到的所有解决方案都谈到了将一个函数传递给另一个函数,这不是我想要做的 我已经在我的应用程序中实现了一些代码,虽然我并不知道它是如何实现的,但它是有效的。我只是希望有人能给我解释一下 这是一个片段类 public class MyFragment extends Fragment { public Callback callback; public interface Callback {

我很难理解回调的概念,为什么我需要使用回调函数而不是普通函数。到目前为止,我看到的所有解决方案都谈到了将一个函数传递给另一个函数,这不是我想要做的

我已经在我的应用程序中实现了一些代码,虽然我并不知道它是如何实现的,但它是有效的。我只是希望有人能给我解释一下

这是一个片段类

public class MyFragment extends Fragment {

    public Callback callback;

    public interface Callback {
        void send(int n); // or whatever
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_entry, container, false);

        CalendarView calendarView = v.findViewById(R.id.calendarView);
        calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
            @Override
            public void onSelectedDayChange(@NonNull CalendarView calendarView, int y, int m, int d) {
                callback.sendDate(d, m, y); // this is where I'm confused
            }
        });

        return v;
    }
}
然后在主要活动中我实施它

public class MainActivity extends AppCompatActivity implements MyFragment.callback {
    public void send(int n) {
        // do whatever with it
    }
}

正如您所看到的,回调函数并不像其他解决方案所说的那样传递给函数。那么,为什么我不能使用常规函数呢?我想为什么我需要一个接口呢?

回调函数在某些功能完成时可以在需要时使用。 例如,一些函数从文件中加载一些文本,并为您提供在加载文件完成后或之前可以执行的功能,例如记录过程。 回调通常是一个具有某些方法的接口。您可以传递实现该接口的任何类(对象)。事实上,作为回调传递给函数的是一个对象,函数知道它,并且知道何时应该调用它的哪个方法。 回调函数的另一个很好的例子是在异步进程中,您不知道进程何时会结束,您传递了实现的目标接口的对象(如果您在要传递它的地方实现它,则调用它的匿名类)。 如果你想知道它是如何完成的,你可以在一个简单的程序中调试并查看程序流程

public class CallbackTest {

interface Callback{
    void beforeOfLoading();
    void middleOfLoading();
    void afterOfLoading();
}

public static void main(String[] args) {
    loadFile(new Callback() {

        @Override
        public void middleOfLoading() {
            System.out.println("Loading is running");
        }

        @Override
        public void beforeOfLoading() {
            System.out.println("Loading is not still run");
        }

        @Override
        public void afterOfLoading() {
            System.out.println("Loading finished");
        }
    });
}

public static void loadFile(Callback callback) {
    callback.beforeOfLoading();
    System.out.println("I'm gonna load some file...");
    callback.middleOfLoading();
    System.out.println("I'm still loading...");
    System.out.println("file loaded");
    callback.afterOfLoading();
}
输出:


回调(lambda语句)只是匿名类的语法糖。@BenjaminUrquhart想详细说明吗?:)你所说的“其他”方式是什么?你能再举个例子吗?谢谢你的回答。我感到困惑的是,这和调用常规函数有什么区别?在从
loadFile
加载之前,您不能只调用
loadFile
然后调用
?区别在于您并不总是访问主功能代码,此外,该功能为您提供了在功能代码生命周期中执行某些操作的方法。
Loading is not still run
I'm gonna load some file...
Loading is running
I'm still loading...
file loaded
Loading finished