我正在使用 com.squareup.retrofit2:retrofit:2.2.0
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.addInterceptor(logging);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://localhost:9000")
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient.build())
.build();
final UserService service = retrofit.create(UserService.class);
Call<User> userCall = service.createUser(user)
问题在于:当我运行execute
时,它会生成REST API请求,但是当我使用enqueue
时,它什么都不做(没有例外,没有日志)
userCall.execute(); //this work
//this does not work
userCall.enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
// no response
}
@Override
public void onFailure(Call<User> call, Throwable t) {
//nothing here
}
});
答案 0 :(得分:5)
好吧,
问题是因为我正在使用模拟器并尝试调用localhost但是,如果你想调用localhost你必须使用这个ip 10.0.2.2
execute
有效,因为我作为单元测试运行但是当它运行enqueue
时,我认为它需要在android平台上运行。
参考这个 https://developer.android.com/studio/run/emulator.html#networkaddresses
答案 1 :(得分:1)
您可以尝试完整的答案Link
这是最短的代码片段。
private void emailLoginRequest() {
LoginService loginService = ApiFactory.createService(LoginService.class);
Call<JsonObject> call = loginService.login(edtEmail.getText().toString(),edtPassword.getText().toString(),mDeviceType,mDeviceToken);
call.enqueue(new Callback<JsonObject>() {
@Override
public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
hideProgressDialog();
if (response.isSuccessful()) {
LOGD(TAG, "onResponse 0: " + response.body().toString());
LoginResponse loginResponse = new Gson().fromJson(response.body().toString(), LoginResponse.class);
System.out.println("+++ get message >> " + loginResponse.getMessage());
int status = loginResponse.getStatus();
}else {
LOGD(TAG, "response fail 0: " + response.body());
}
}
@Override
public void onFailure(Call<JsonObject> call, Throwable t) {
hideProgressDialog();
LOGD(TAG, "onFailure: " + t.getMessage());
}
});
}
答案 2 :(得分:0)
将您的代码设为:
userCall.enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
Toast.makeText(this, "in response", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(Call<User> call, Throwable t) {
Toast.makeText(this, "in response", Toast.LENGTH_SHORT).show();
}
});
现在基于方法调用你会得到吐司,如果它的响应toast将是“响应”不要忘记在此之前写youractivity名称像:MainActivity.this
答案 3 :(得分:0)
retrofit 可以分别调用两种方法,一种是同步的,另一种是异步的。
enqueue 是一种异步方式,它不等待响应并继续。这里需要单独处理Call以便稍后加载UI。
执行是异步调用rest api并等待直到得到响应并处理它。
明智的选择