繁体   English   中英

如何从 onResponse 返回值

[英]How to return value from onResponse

如何从 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;
    }

enqueue函数在后台运行你的 API 调用,一个不同的线程。

任何 API 调用都不应该在主线程中完成,这就是您不能从enqueue返回的原因。

但是,您可以在主线程上就地运行 API 调用。 它不recommonded,因为它会让你的应用程序UI冻结而API调用正在处理连线。

做你想要实现的事情的一种方法是使用一组回调。

您在方法中放置了 2 个参数。 onSuccessonFailure 两者都是 Lambda, 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;
    }

在您的用户界面中

testConnection((isConnected) -> {

}, (error) -> {

});

Retrofit 的enqueue是一个带有异步回调的非阻塞调用。 而是使用execute()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM