如何从onresponse返回值

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

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

  1. static boolean isConnected = false;
  2. public static boolean testConnection() {
  3. apiInterface = ApiClient.getApiClient().create(Api.class);
  4. Call<String> call = apiInterface.testConnection();
  5. call.enqueue(new Callback<String>() {
  6. @Override
  7. public void onResponse(Call<String> call, Response<String> response) {
  8. if (response.body().equals("Connected")) {
  9. isConnected = true;
  10. } else {
  11. isConnected = false;
  12. }
  13. }
  14. @Override
  15. public void onFailure(Call<String> call, Throwable t) {
  16. Log.d("infomessage", t.getMessage());
  17. isConnected = false;
  18. }
  19. });
  20. return isConnected;
  21. }
tv6aics1

tv6aics11#

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

  1. public static boolean testConnection(Function<Boolean, Void> onSuccess, Function<Exception, Void> onFailure) {
  2. apiInterface = ApiClient.getApiClient().create(Api.class);
  3. Call<String> call = apiInterface.testConnection();
  4. call.enqueue(new Callback<String>() {
  5. @Override
  6. public void onResponse(Call<String> call, Response<String> response) {
  7. if (response.body().equals("Connected")) {
  8. onSuccess.invoke(true);
  9. } else {
  10. onSuccess.invoke(false);
  11. }
  12. }
  13. @Override
  14. public void onFailure(Call<String> call, Throwable t) {
  15. Log.d("infomessage", t.getMessage());
  16. onSuccess.invoke(false);
  17. onFailure.invoke(t);
  18. }
  19. });
  20. return isConnected;
  21. }

在ui中

  1. testConnection((isConnected) -> {
  2. }, (error) -> {
  3. });
展开查看全部
hjzp0vay

hjzp0vay2#

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

相关问题