【发布时间】: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. 使用布尔值true和false而不是String值"true"和"false"。
标签: java android android-studio