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

标签 java android function callback

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

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

这是一个 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/

相关文章:

java - java中的AES加密和使用CryptoJS的javascript解密

java - 在Java/Swing中,是否可以在用户需要时创建新的 "main"JPanel对象?

java - Fragment运行时异常调试

Android - map - 我的位置按钮不工作,蓝点不显示

c - 如何使用 return 命令而不是 printf 来获得定义的 float 函数的相同输出?

java - XStream - com.thoughtworks.xstream.converters.ConversionException

java - 调用同步方法的线程是否会使用同一对象但以非同步方式抢占另一个线程?

android - Visual Studio 不显示已安装的 Android api 级别

javascript - ui.draggable 显示确认是否被取消。

function - 从经典 ASP 中的函数返回记录集