2015-07-11 2 views
0

Я довольно новичок в разработке Java и Android. Я пытаюсь сделать приложение для своего сайта. Я использую Retrofit для подключения к моему веб-сервису REST.Невозможно изменить переменную из анонимного класса

Ниже приведен фрагмент кода, который я использую для итерации через идентификаторы клиента и для каждого идентификатора, выполняется вызов для получения электронного письма, связанного с идентификатором. authenticateUser метод получает имя пользователя, пароль и список идентификаторов (идентификаторы клиентов). Иды расположены в mywebsite/api/customers. Письма доступны на МойВебСайт/API/клиентов/ид

public class Authentication { 

    private static String receivedEmail; 
    public static boolean authenticateUser(List<Integer> ids, final String username, String pass) { 
     RestAdapter adapter = new RestAdapter.Builder().setEndpoint(MainActivity.ENDPOINT).build(); 
     AuthenticationUsernameAPI api = adapter.create(AuthenticationUsernameAPI.class); 
     final boolean[] found = {false}; 
     for (Integer id: ids) { 
      if (!found[0]) { 
       api.getUserEmail(id.toString(), new Callback<CustomerLoginEmail>() { 
        @Override 
        public void success(CustomerLoginEmail customerLoginEmail, Response response) { 
         receivedEmail = customerLoginEmail.getCustomer().getEmail().toString(); 
         if (receivedEmail.compareTo(username) == 0) {       
          found[0] = true; 
         } 
        } 

        @Override 
        public void failure(RetrofitError error) { 
         Log.d("ERROR", error.getMessage()); 
        } 
       }); 
      } else { 
       return true; 
      } 
     } 
     return false; 
    }  
} 

Метод authenticateUserвсегда возвращает ложь. Пожалуйста, помогите

ответ

0

Я понял. Это было довольно очевидно и легко, но поскольку я новичок во всем этом (или, может быть, я глуп: p), мне потребовалось довольно много времени.

Я использовал синхронный вызов Retrofit's. Интерфейс:

@GET("/user/{id}") 
UserObject getUser(@Path("id") int id); 

и я назвал его в AsyncTask так:

UserObject user = api.getUser(); 

Надеется, что это помогает любые другие новичкам, как я

1

Причина в том, что цикл регистрирует обратные вызовы и не ждет их завершения, поэтому он также не ждет, чтобы проверить, действительно ли вызваны обратные вызовы. Поскольку обратные вызовы не были завершены вовремя, у них не было шанса изменить found[0] на true, прежде чем он был проверен условием if.

Вы должны реорганизовать код, чтобы он дождался завершения каждого обратного вызова.

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