2015-11-13 2 views
2

Я пытаюсь запустить простое тестовое приложение для изучения Retrofit. Метод onFailure всегда называется, пожалуйста, помогите мне. Все, что я сделал это следующим образом:Retrofit-Callback.onFailure называется

MainActivity

public class MainActivity extends Activity 
{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     method(); 
    } 

    public void method() 
    { 
     final String BASE_URL = "http://192.168.1.7/"; 
     Retrofit retrofit = new Builder() 
     .baseUrl(BASE_URL) 
     .addConverterFactory(GsonConverterFactory.create()) 
     .build(); 

     ApiService service = retrofit.create(ApiService.class); 
     Call<ResponseBody> call = service.login(); 
     call.enqueue(new Callback<ResponseBody>(){ 
      @Override 
      public void onResponse(Response<ResponseBody> response, Retrofit retrofit) 
      { 
       // TODO Auto-generated method stub 
       if (response.isSuccess()) 
       { 
        Log.i("mok","S"); 
        ResponseBody rb = response.body(); 
       } 
       else 
       { 
        Log.i("mok","F"); 
        com.squareup.okhttp.ResponseBody rb = response.errorBody(); 
       } 

      } 
      @Override 
      public void onFailure(Throwable t) 
      { 
       Log.i("mok",t.getCause()+"");//This is null 
       Log.i("mok","T");//This is shown in LogCat 
       finish(); 
      } 
     }); 
    } 
} 

RespnseBody:

public class ResponseBody 
{ 
    private String username; 
    private String password; 
    public ResponseBody(String username, String password) 
    { 
     this.setUsername(username); 
     this.setPassword(password); 
    } 
    public String getUsername() { 
     return username; 
    } 
    public void setUsername(String username) { 
     this.username = username; 
    } 
    public String getPassword() { 
     return password; 
    } 
    public void setPassword(String password) { 
     this.password = password; 
    } 
} 

ApiService:

public interface ApiService 
{ 
    @POST("test_retrofit.php") 
    public Call<ResponseBody> login(); 
} 

test_retrofit.php: // находится в директории WWW (работает WampServer на моем компьютере)

<?php 
$response = array("error" => FALSE); 
if (isset($_POST['username'])) 
{ 
    $response["username"] = "moker"; 
    $response["password"] = "0107"; 
    echo json_encode($response); 
} 
else 
{ 
    $response["username"] = "mok"; 
    $response["password"] = "107"; 
    echo json_encode($response); 
} 
?> 

Edit: (После того, как полезный намек iagreen в)

Исключение:

Java. net.SocketTimeoutException: не удалось подключиться к /192.168.1.7 (порт 80) после 10000ms

+0

, пожалуйста, добавьте журналы, чтобы мы могли узнать больше setLogLevel (RestAdapter.LogLevel.FULL) –

+0

@LaurentRussier «Retrofit 2 больше не интегрирует никаких функций ведения журнала». https://futurestud.io/blog/retrofit-using-the-log-level-to-debug-requests/: (( – mok

+1

да ... вот почему он все еще бета-версия, но вы можете попробовать этот http: // stackoverflow.com/questions/32514410/logging-with-retrofit-2, чтобы получить журнал –

ответ

1

Похоже, ваше устройство не может подключиться к серверу , Вы тестировали его с того же устройства, на котором вы тестируете модернизацию? Другой вариант - это устройство в другой сети. 192.168.x.x - частный IP-адрес, поэтому, если телефон не находится в той же подсети, он не найдет сервер. Или, как оказалось, вам нужно убедиться, что ваш брандмауэр разрешает подключения к вашему серверу.

+0

Еще раз спасибо – mok

0

Удалите последнюю косую черту вашего BASE_URL и поместите ее в начало @POST ("test_retrofit.php") => @POST ("/ test_retrofit.php")

+0

спасибо. но ничего не изменилось. – mok

Смежные вопросы