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