gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:54:06 24 4
gpt4 key购买 nike

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

我已经在我的应用程序中实现了代码,我并不真正知道它的作用,但它有效。我只是希望有人能为我解释一下。

这是一个 fragment 类

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;
}
}

然后在主要 Activity 中我实现它

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

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

最佳答案

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

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

输出:

Loading is not still run
I'm gonna load some file...
Loading is running
I'm still loading...
file loaded
Loading finished

关于java - 何时使用回调而不是普通函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57835501/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com