改造入队不起作用,但执行工作

时间:2017-03-30 12:01:59

标签: java android http retrofit

我正在使用 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
      }
  });

4 个答案:

答案 0 :(得分:5)

好吧,

问题是因为我正在使用模拟器并尝试调用localhost但是,如果你想调用localhost你必须使用这个ip 10.0.2.2

execute有效,因为我作为单元测试运行但是当它运行enqueue时,我认为它需要在android平台上运行。

参考这个 https://developer.android.com/studio/run/emulator.html#networkaddresses

How to get the Android Emulator's IP address?

答案 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)

see this

retrofit 可以分别调用两种方法,一种是同步的,另一种是异步的。

enqueue 是一种异步方式,它不等待响应并继续。这里需要单独处理Call以便稍后加载UI。

执行是异步调用rest api并等待直到得到响应并处理它。

明智的选择