【问题标题】:Why is method not returning true?为什么方法不返回true?
【发布时间】:2018-02-06 18:29:23
【问题描述】:

我在方法内部有一个 HTTP 请求,我试图根据请求的响应返回真/假。我不确定我做错了什么,我认为这很简单。在测试场景中,onResponse 调用内部的条件返回 true。不知道在翻译中丢失了什么。 此外,在最终条件下,“消息”变量是紫色的,在 android studio 中,我不确定这表示什么。我认为这与我的问题有关。建议?

public class DeleteButtonChecker {
    public String message = new String();
    public Boolean doCheck(int userID, int postID){
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Constants.BASE_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
        RequestInterface requestInterface = retrofit.create(RequestInterface.class);
        Call<ServerResponse> response = requestInterface.check(postID, userID);
        response.enqueue(new Callback<ServerResponse>() {
            @Override
            public void onResponse(Call<ServerResponse> call, Response<ServerResponse> response) {
                ServerResponse resp = response.body();
                if(resp.getResult().equals(Constants.SUCCESS)){
                    message = "true";
                } else {
                    message = "false";
                }
            }
            @Override
            public void onFailure(Call<ServerResponse> call, Throwable t) {

            }
        });
        if(message.equals("true")) {
            return true;
        } else{
            return false;
        }
    }
}

【问题讨论】:

  • 如果你调试你的代码会发生什么?逐行跟踪关键变量的实际值与预期值,直到找到错误。提示:您可能不想将消息公开,因为它是一个保存对象状态的私有属性。此外,将真/假状态放入字符串中是很麻烦的。为什么不使用布尔值?您不需要使用new String()。见这里:stackoverflow.com/q/3652369/1531971
  • 您的 http 请求异步执行,您的函数将在您实际收到来自服务器的响应之前返回。你不能有函数返回值,但你必须实现在你得到服务器响应后执行的回调。
  • 您的代码是否正在运行?您如何在回调的匿名实现中设置 message = "true"/"false"。因为它应该给出错误,例如“在封闭范围中定义必须是最终的或有效的最终”。
  • 另外,无关的小补充,你应该将你的 OkHttpClient 声明为单例,而不是每次都实例化它。
  • 一些与您的问题无关的建议: 1. 不要使用new String()。 2. 使用布尔值truefalse 而不是String"true""false"

标签: java android android-studio


【解决方案1】:

响应是异步处理的。上线:

response.enqueue(new Callback<ServerResponse>() {
...

您只是在返回响应后提供要执行的回调。然而,该方法并没有被阻塞并继续到下一条语句 - 这是:

if(message.equals("true")) {

可以翻译成:

if("".equals("true")) {

【讨论】:

    【解决方案2】:

    根据您的条件,不能将异步请求视为同步调用。 如果是我,我会使用 RxJava 2 Single 和 Retrofit 从请求中返回可用的结果。

    看看这个:https://github.com/square/retrofit/tree/master/retrofit-adapters/rxjava2

    并确保学习一些 RxJava 可以帮助你在路上

    【讨论】:

      猜你喜欢
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-29
      相关资源
      最近更新 更多