如何从onresponse返回值

7y4bm7vi  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(454)

我怎样才能返回值从 Retrofit 2 查询或做类似的事情?我需要返回isconnected变量。问题是,当我调用testconnection()时,它会自动返回false,因为发送到服务器的请求尚未处理。我必须等待请求得到处理,但如何处理?

static boolean isConnected = false;

public static boolean testConnection() {

        apiInterface = ApiClient.getApiClient().create(Api.class);

        Call<String> call = apiInterface.testConnection();
        call.enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {

                if (response.body().equals("Connected")) {
                    isConnected = true;
                } else {
                    isConnected = false;
                }
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {
                Log.d("infomessage", t.getMessage());
                isConnected = false;
            }
        });
        return isConnected;
    }
tv6aics1

tv6aics11#

这个 enqueue 函数在后台运行api调用,一个不同的线程。
任何api调用都不应该在主线程中执行,这就是为什么不能从 enqueue .
但是,可以在主线程上就地运行api调用。不建议这样做,因为在处理api调用时,它会使应用程序ui冻结。
一种方法是使用一组回调来实现您要实现的功能。
在方法中输入两个参数。 onSuccess ,和 onFailure . 两个都是lambdas onSuccess 有一个 bool 参数,以及 onFailure 有一个 Exception 参数。
这就是你的代码的样子

public static boolean testConnection(Function<Boolean, Void> onSuccess, Function<Exception, Void> onFailure) {

        apiInterface = ApiClient.getApiClient().create(Api.class);

        Call<String> call = apiInterface.testConnection();
        call.enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {

                if (response.body().equals("Connected")) {
                    onSuccess.invoke(true);
                } else {
                    onSuccess.invoke(false);
                }
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {
                Log.d("infomessage", t.getMessage());
                onSuccess.invoke(false);
                onFailure.invoke(t);
            }
        });
        return isConnected;
    }

在ui中

testConnection((isConnected) -> {

}, (error) -> {

});
hjzp0vay

hjzp0vay2#

改装 enqueue 是具有异步回调的非阻塞调用。而是使用 execute()

相关问题